我有兩個文件(比如說a.txt
和b.txt
),它們都有一個名稱列表。我已經在這兩個文件上運行了sort
。從文件中查找不在另一個文件中的行
現在我想找到a.txt
這行不在b.txt
中的行。
(我花了很多時間來找到這個問題的答案,所以記錄以供將來參考)
我有兩個文件(比如說a.txt
和b.txt
),它們都有一個名稱列表。我已經在這兩個文件上運行了sort
。從文件中查找不在另一個文件中的行
現在我想找到a.txt
這行不在b.txt
中的行。
(我花了很多時間來找到這個問題的答案,所以記錄以供將來參考)
,你必須使用的命令是不是diff
但comm
comm -23 a.txt b.txt
默認情況下, comm
輸出3列:只剩,右鍵,均爲。 -1
,-2
和-3
開關禁止這些列。
所以,-23
隱藏右僅和兩者列,顯示只出現在第一(左)文件中的行。
如果你想找到出現在兩條線,你可以使用-12
,隱藏左僅和右只列,讓你只用都列。
簡單的答案不適用於我,因爲我沒有意識到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倍。
I將我的文件分類並通過uniq傳遞。無論如何感謝其他解決方案。 – Sudar
我不知道爲什麼有人說不應該使用diff
。我會用它來比較這兩個文件,然後只輸出左側文件中的行,而不是右側的文件。這種線由DIFF與<
所以它足以給grep該符號在該行
diff a.txt b.txt | grep \^\<
您可以使用'diff --new-line-format = --unchanged-line-format = a.txt b.txt'來禁止打印新的和未更改的行。 –
在這些文件不會被尚未整理的情況下開始標記,你可以使用:
comm -23 <(sort a.txt) <(sort b.txt)
我會補充說,這隻適用於兩個文件都被排序的情況。 (我知道OP提到他對這些文件進行了排序,但是包括我在內的很多人閱讀了問題標題,然後跳到答案) – user247866
@ user247866:幸運的是,通信足以告訴你他們是否沒有排序:) – marlar