通过使用不同的文件作为翻译列表,用 AWK 替换字段
Posted
技术标签:
【中文标题】通过使用不同的文件作为翻译列表,用 AWK 替换字段【英文标题】:Replace fileds with AWK by using a different file as translation list 【发布时间】:2013-07-18 13:46:01 【问题描述】:我在 Windows 中使用awk
。我有一个名为test.awk
的脚本。
这个脚本应该读取一个文件并用一个值替换某个文件(键)。
键->值列表位于名为translate.txt
的文件中。
它的结构是这样的:
e;Emil
f;Friedrich
g;Gustaf
h;Heinrich
i;Ida
在一个简单的例子中,我的输入文件是
e,111
f,222
g,333
h,444
i,555
..
所以输出应该是
Emil,111
Friedrich,222
Gustaf,333
Heinrich,444
Ida,555
..
我拥有的脚本正在使用用户函数key2value
进行替换,但我没有成功地为该函数提供另一个文件translate.txt
作为源。查看我的代码:
FS=","
d=key2value($1)
print d "," $2
function key2value(b)
#this should use another file, not the currently processed one
FILENAME="translate.txt"
begin
FS=";"
if ($1=b)
return $2
end
另外,FS 有问题,它只从第二行开始工作。
【问题讨论】:
【参考方案1】:这个简单的单线就可以解决问题:
awk 'FNR==NRa[$1]=$2;nextprint a[$1],$2' FS=',|;' OFS=',' translate input
Emil,111
Friedrich,222
Gustaf,333
Heinrich,444
Ida,555
脚本形式:
BEGIN # The BEGIN block is executed before the files are read
FS="[,;]" # Set the FS to be either a comma or semi-colon
OFS="," # Set the OFS (output field separator) to be a comma
FNR==NR # FNR==NR only true when reading the first file
key2value[$1]=$2; # Create associative array of key,value pairs
next # Grab the next line in the first file
# Now in the second file, print looked up value and $2
print key2value[$1],$2
运行方式:
awk -f translate.awk translate.txt input.txt
你的脚本有很多错误,你应该阅读Effective AWK Programming。
【讨论】:
好。此类问题已在本论坛使用awk
多次解决。这是一个标准。
非常感谢,你伟大的 awk 之神!【参考方案2】:
GNU sed 的代码(Windows 引用):
sed -r "s#(\S+);(\S+)#/^\1,/s/.*,(\\S+)/\2,\\1/#" file1|sed -rf - file2
Shell 会话:
>类型文件1文件2 文件 1 e;埃米尔 f;弗里德里希 g;古斯塔夫 h;海因里希 我;艾达 文件2 e,111 f,222 克,333 小时,444 我,555 >sed -r "s#(\S+);(\S+)#/^\1,/s/.*,(\\S+)/\2,\\1/#" file1|sed -rf - file2 埃米尔,111 弗里德里希,222 古斯塔夫,333 海因里希,444 艾达,555【讨论】:
以上是关于通过使用不同的文件作为翻译列表,用 AWK 替换字段的主要内容,如果未能解决你的问题,请参考以下文章
如何根据来自不同命令的多行打印输出的输入将文本文件内容替换为“sed”或“awk”?
PHPWord使用PHPWord替换模板变量大段文字并换行设置字体字号