2011-11-18 75 views
2

這必須是您輕鬆比較兩個文件使用awk或sed的

這裏是文件1(一列)

1 
2 
3 
4 
5 
6 
7 
8 
9 

,這裏是文件2(兩列)

2 yay 
3 ups 
4 wow 
8 hey 

有必須是一個簡單的單行程序,用於打印出與文件2不匹配的文件1中的行

+1

請注意,'join'和'comm'解決方案需要對輸入文件進行排序,他們碰巧遇到了這個問題。 awk解決方案不關心如果沒有排序。 –

回答

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

,或者使用與-v加盟,作爲@邁克爾建議:

join -v1 file1 file2 

都將打印:

1 
5 
6 
7 
9 
+0

你能解釋一下你的awk單線程+1嗎? :) –

+3

@Jaypal awk在數組中保存file2,索引是field1;那麼對於file1中的每一行,檢查它是否是數組的索引,以進行比較。 ++沒什麼特別的,但爲元素設置了一個值。一個[$ 1] = 1;也起作用。但++鍵入更快。 :) – Kent

3

您可以通過將cutcomm

cut -d' ' -f1 file2 | comm -13 - file1 

您也可以考慮join,這取決於你想如何處理重複行。

2

這SED解決方案可能會爲你工作:

{ seq 1 10; echo -e "2 yay\n3 ups\n4 wow\n8 hey"; } | sort -n | 
sed '1{h;d};H;${x;s/\(\S\+\)\n\1[^\n]*\n//g;p};d' 
1 
5 
6 
7 
9 
10 

說明:對文件進行數字排序,然後使用sed將文件吸入保留空間(HS)。在文件交換到HS的末尾,然後使用重複鍵刪除行。