cat file1
xi=zaoshui jiao=@E0488_5@
chi=fan da qiu=@E0488_3@
gong=zuo you xi @E0977_5@

cat file2
@E0488_3@ @E21562_3@
@E0488_5@ @E21562_5@
@E0977_3@ @E21630_3@
@E0977_5@ @E21630_5@
@E0977_6@ @E21631_1@

目的:如果在file2 $1 中找到file1 中的$NF,则用file2 $2 替换file1 中的$NF。否则,不做任何更改。

我的代码:
awk 'NR==FNR{a[$1]=$2;next}
     {split($NF,a,"=");for($NF in a){$NF=a[$NF]}}1' test2.txt test1.txt

但它来了错误:
awk: cmd. line:1: NR==FNR{a[$1]=$2;next}{split($NF,a,"=");for($NF in a){$NF=a[$NF]}}1
awk: cmd. line:1:                                                     ^ syntax error

我的代码看起来正确吗?似乎发生了语法问题。我该如何改进?

我的期望输出:
   xi=zaoshui jiao=@E21562_5@
   chi=fan da qiu=@E21562_3@
   gong=zuo you xi @E21630_5@

最佳答案

  • for($NF in a) 不是有效的语法,($NF 给出值)

  • 它可以像
    for (var in array)
        body
    

    阅读更多内容:GNU AWK Scanning-an-Array
  • 使用 sub($NF,a[$NF]) 保留您的原始字段分隔符,自最后一条记录以来,最后一个字段之前有空格,而其他行最后一个字段之前有 =,假设除最后一个字段之外的值不重复。

  • 测试结果:
    $ cat file1
    xi=zaoshui jiao=@E0488_5@
    chi=fan da qiu=@E0488_3@
    gong=zuo you xi @E0977_5@
    
    $ cat file2
    @E0488_3@ @E21562_3@
    @E0488_5@ @E21562_5@
    @E0977_3@ @E21630_3@
    @E0977_5@ @E21630_5@
    @E0977_6@ @E21631_1@
    
    $ awk 'FNR==NR{a[$1]=$NF;next}($NF in a){sub($NF,a[$NF])}1' file2 FS='[ =]' file1
    xi=zaoshui jiao=@E21562_5@
    chi=fan da qiu=@E21562_3@
    gong=zuo you xi @E21630_5@
    

    关于shell - 循环中的 awk 语法错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47785935/

    10-11 11:17