2013-01-23 123 views
61

我有兩個文件(比如說a.txtb.txt),它們都有一個名稱列表。我已經在這兩個文件上運行了sort從文件中查找不在另一個文件中的行

現在我想找到a.txt這行不在b.txt中的行。

(我花了很多時間來找到這個問題的答案,所以記錄以供將來參考)

回答

101

,你必須使用的命令是不是diffcomm

comm -23 a.txt b.txt 

默認情況下, comm輸出3列:只剩,右鍵,均爲-1-2-3開關禁止這些列。

所以,-23隱藏右僅兩者列,顯示只出現在第一(左)文件中的行。

如果你想找到出現在兩條線,你可以使用-12,隱藏左僅右只列,讓你只用列。

+9

我會補充說,這隻適用於兩個文件都被排序的情況。 (我知道OP提到他對這些文件進行了排序,但是包括我在內的很多人閱讀了問題標題,然後跳到答案) – user247866

+1

@ user247866:幸運的是,通信足以告訴你他們是否沒有排序:) – marlar

20

簡單的答案不適用於我,因爲我沒有意識到comm匹配行的行,所以一個文件中的重複行將被打印爲另一行中不存在。例如,如果file1包含:

Alex 
Bill 
Fred 

和File2包含:

Alex 
Bill 
Bill 
Bill 
Fred 

然後comm -13 file1 file2將輸出:

Bill 
Bill 

在我的情況,我想知道的只是,每串無論文件在每個文件中出現多少次,文件2都存在於file1中。

解決方案1:unix.stackexchange(第一個 「工作」 的答案,我發現):使用-u(唯一的)標誌sort

comm -13 <(sort -u file1) <(sort -u file2)

解決方案2

fgrep -v -f file1 file2

請注意,如果file2包含dupli在file1,fgrep中根本不存在的曲線將輸出每個重複行。另請注意,對於單個(相當大)的數據集,在單檯筆記本電腦上進行的完全非科學測試顯示,解決方案1(使用comm)比解決方案2(使用fgrep)快近5倍。

+0

I將我的文件分類並通過uniq傳遞。無論如何感謝其他解決方案。 – Sudar

2

我不知道爲什麼有人說不應該使用diff。我會用它來比較這兩個文件,然後只輸出左側文件中的行,而不是右側的文件。這種線由DIFF與<所以它足以給grep該符號在該行

diff a.txt b.txt | grep \^\< 
+1

您可以使用'diff --new-line-format = --unchanged-line-format = a.txt b.txt'來禁止打印新的和未更改的行。 –

3

在這些文件不會被尚未整理的情況下開始標記,你可以使用:

comm -23 <(sort a.txt) <(sort b.txt) 
相關問題