2016-03-07 133 views
0

我想求人关于下列问题不正确的响应:awk脚本中, “if” 语句

我有两个文件,文件1:

1 apples 
2 bananas 
3 orange 
4 prunes 

和文件2:

1 oranges 
2 apples 
3 nuts 

我需要从file2中提取所有与file1不匹配的行(即“3个坚果”)。我写了一个脚本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 

但是,我得到的结果是文件2个几倍的只是内容。 问题可能是什么?

+0

对于文件中的每一行,你都打印出与它不一样的所有'a [i]'。 – Barmar

+0

您需要浏览所有* a中的条目。如果它们中没有一个匹配,则打印'a [i]'。一个简单的方法是将'a'设为一个关联数组,其中'$ 2'是索引。然后你可以写'if(!($ a in a))' – Barmar

+1

在第二个文件中,'1 oranges'与第一个文件中的'3 orange'不匹配,除非你做了一些花哨的语言分析,显示。 (另外,复数和单数都回到前面:'1橙色','3橙子':) :) _) –

回答

3

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

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

将返回

3 nuts 
1 oranges 

,如果你在你的第一个文件变“橙”到“橘子”你只会得到坚果。

类似的功能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 

笔记文件2首先提供。

这将是简单不过,文件1,首先提供的其他方式

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

1 oranges 
3 nuts 

音符。