awk脚本,“if”语句的错误响应

时间:2016-03-07 17:36:36

标签: bash awk scripting

我想就以下问题寻求帮助:

我有两个文件,文件1:

1 apples
2 bananas
3 orange
4 prunes

和文件2:

1 oranges
2 apples
3 nuts

我需要从file2中提取所有与file1不匹配的行(即“3 nuts”)。我写了一个awk脚本:

#!/bin/awk -f 
BEGIN {
   while (getline <hdr>0) {
     a[i++]=$2;
   }
   close (hdr);
}
{ for (i in a) {
    if (a[i]!=$2) {
      print a[i];
    }
  }
}   

我的命令行:

awk -v hdr=file2 -f script_name file1

但我得到的结果只是file2的内容多次。 问题可能是什么?

1 个答案:

答案 0 :(得分:3)

您的代码有很多问题(即使是输入文件)。假设行号是您输入的一部分,您可以尝试这个

$ join -v2 -12 -22 -o2.1,2.2 <(sort -k2 file1) <(sort -k2 file2)

将返回

3 nuts
1 oranges

如果你改变&#34;橙&#34;到&#34;橘子&#34;在你的第一个文件中,你只会得到坚果。

类似的功能awk脚本将是

$ awk 'NR==FNR{a[$2]=$0; next} 
       $2 in a{delete a[$2]} 
           END{for(k in a) print a[k]}' file2 file1

3 nuts
1 oranges

注意首先提供file2。

然而,相反,

会更简单
$ awk 'NR==FNR{a[$2]; next} !($2 in a)' file1 file2

1 oranges
3 nuts

请注意首先提供file1。