2016-02-26 16 views
1

我有兩個文件由選項卡分隔。比較第一個字段的文件,我需要打印字段不匹配的行。但是要打印的行是從文件(文件1)AWK - 如果不在數組中

文件1:

adu adu noun singular n/a n/a nominative 
aduink adu noun plural 1pl n/a nominative 
adum adu noun singular 1s n/a nominative 

文件2:

adu adu noun singular n/a n/a nominative 
aduink adu noun plural 1pl n/a nominative 
xxadum adu noun singular 1s n/a nominative 

所需的輸出:

adum adu noun singular 1s n/a nominative 

我在想什麼:

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

但我需要打印,從文件(file1)行而不是從文件(file2)。我不能更改順序處理文件

+0

您的'FNR == NR'表達式在awk腳本之後列出的第一個文件上運行,在本例中爲'file1'。這意味着您的後續表達式'!($ a in a)'將針對'file2'中的行進行評估。如果你想在數組中存儲'file2'的'$ 1',然後比較'file1'和數組的行,只需在awk命令行上交換文件的順序。 – ghoti

回答

2

我不明白爲什麼你不能改變這些文件的順序(即更簡單),但是你用同樣的順序,你可以這樣做:

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

的想法是在指數$1在處理第二個要刪除的文件的所有項目。最後,您只需要打印剩餘的物品。

+1

@EdMorton:我不知道有可能刪除一個數組項,謝謝你的提示。 –

1

你爲什麼不交換的說法,要傳遞到awk文件,

awk 'FNR==NR{a[$1]=$0;next} !($1 in a)' file2 file1 
              |  | 
             arg1 arg2 
+0

不需要'= $ 0',它沒有被使用,只是吸內存。 –

1

如果你不能改變文件順序AWK時被調用,只是改變它裏面AWK:

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

這樣,你就不必在內存中存儲兩個文件。

0

遲到了,但這裏是爲了做到這一點

$ join -v1 file1 file2 

adum adu noun singular 1s n/a nominative 

就是打壓加入線條和打印從第一檔未成對行簡單的方法。默認情況下加入是由第一個字段。