2016-03-07 129 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 

音符。