该脚本需要3个输入参数:
我使用的脚本是:
BEGIN {
while (getline < ARGV[1]) {
subs[$1]=$2; #store the replacements in an array
original[$1]=$1; #store the originals in a different array
}
}
{
if (FILENAME == ARGV[2]) { # I need this because otherwise the script runs on every input file
for (i in original) {
if ($0 ~ i) { # replace string
gsub(i, subs[i]); # maybe sub is better here
}
}
print $0; # debug purposes
print $0 >> ARGV[3] # append on the output file
}
}
它有效,但由于我还在学习AWK,我不知道是否有更简单的方法可以做到这一点。我仍然不明白我是否可以在不同的参数中选择一个输入文件,以及如何。
第一个文件的示例是
awk Awk
unix UNIX
o O
输入文件:
awkscriptAsInput
contains unix e UNIX
and other stuff
预期结果:
AwkscriptAsInput
cOntains UNIX e UNIX
and Other stuff
答案 0 :(得分:2)
如果我理解你的要求是正确的,你的awk脚本可以用这种方式完成:
awk 'NR==FNR{s[$1]=$2;next}{for(x in s)gsub(x,s[x])}7' file1 file2 > file3
awk 'NR==FNR{s[$1]=$2;next} // save file1 into an array, like s[awk]="Awk"
{for(x in s)gsub(x,s[x])} //for each pattern/replacement pair, do gsub on the line
7' file1 file2 > file3 // print the line. 7 here is non-zero number, it does default action: print
如果您希望始终将数据附加到您的文件,请使用>>
代替>
请注意,如果替换文件(file1)包含递归替换模式,则结果可能不同。 E.g:
awk Awk
....
A a
答案 1 :(得分:0)
在Kent的解决方案之上,以下将保留替换顺序,以保留可能有意的副作用。
awk 'NR==FNR{f[++c]=$1;r[c]=$2;next}{for(i=1;i<=c;i++)gsub(f[i],r[i])}1' dict input
说明:从第一个文件(dict)中分别收集数组f和r中的字典查找/替换字(使用行号作为数组索引)。在第二个文件(输入)中按给定顺序查找/替换字典单词。 1
强制打印结果,此处您也可以使用print
awk ...gsub(f[i],r[i]);print}' dict input