通过使用不同的文件作为翻译列表,用 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 替换字段的主要内容,如果未能解决你的问题,请参考以下文章

awk 内置函数列表

awk用法之:文本替换

如何根据来自不同命令的多行打印输出的输入将文本文件内容替换为“sed”或“awk”?

PHPWord使用PHPWord替换模板变量大段文字并换行设置字体字号

PHPWord使用PHPWord替换模板变量大段文字并换行设置字体字号

如何使用 sed 或 awk 命令用变量(变量保存 Unix 脚本)查找和替换文本