如何改进以下AWK脚本?

时间:2015-08-24 10:51:51

标签: awk

该脚本需要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

2 个答案:

答案 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