5

awk在 Windows 中使用。我有一个名为test.awk. 这个脚本应该读取一个文件并用一个值替换某个文件(键)。key->value 列表位于一个名为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 有问题,它只从第二行开始工作。

4

2 回答 2

7

这个简单的单线就可以了:

awk  'FNR==NR{a[$1]=$2;next}{print 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

于 2013-07-19T10:10:50.567 回答
1

GNU 的代码(Windows 引用):

sed -r "s#(\S+);(\S+)#/^\1,/s/.*,(\\S+)/\2,\\1/#" file1|sed -rf - file2

外壳会话:

>类型文件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
于 2013-07-19T10:57:41.740 回答