2013-01-23 12 views
61

私は2つのファイルを持っています(例えば、a.txtb.txt)。どちらも名前のリストを持っています。私はすでにsortを両方のファイルで実行しています。ファイルから別のファイルに存在しない行を見つけよう

b.txtに存在しないa.txtの行を探したいと思います。

あなたが使用する必要があり、コマンドがdiffではなく、デフォルトでcomm

comm -23 a.txt b.txt 

答えて

101

(私はそう今後の参考のために、それを文書化し、この質問のための答えを見つけるために多くの時間を費やしました)、 commは、3列:左のみ,右のみ,両方を出力します。 -1,-2および-3スイッチは、これらの列を抑制します。

そこで、-23は最初(左)ファイルに表示される行を示し、右のみ両方列を非表示にします。

あなたは両方に表示される行を検索したい場合は、あなただけの両方列であなたを残して、左のみ右のみ列を隠し-12を、使用することができます。

+9

これは、両方のファイルがソートされている場合にのみ機能すると付け加えます。 (私はOPが彼がファイルをソートしたと知っていますが、多くの人が私を含めて、質問のタイトルを読んで答えにジャンプします) – user247866

+1

@ user247866:幸いにもcommは親切で、ソートされていないかどうかを教えてくれます:) – marlar

20

私はcommが行の行に一致することを認識していなかったので、単純な答えはうまくいかなかったので、あるファイルの重複する行は、もう一方の行には存在しないとして印刷されます。 file1が含まれている場合たとえば、:

Alex 
Bill 
Fred 

とfile2が含まれる:

Alex 
Bill 
Bill 
Bill 
Fred 

はその後comm -13 file1 file2は出力になります、私だけですべての文字列ということを知っている私の場合は

Bill 
Bill 

たかったですfile2はfile1に存在し、各ファイルにその行が何回発生したかにかかわらず存在しました。

解決方法1:sort-u(ユニーク)フラグを使用します。

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

解決策2:(私が最初に見つかった "作業" の回答)unix.stackexchangeから:

fgrep -v -f file1 file2

file2にdupli file1にはまったく存在しないcate行、fgrepは重複する行のそれぞれを出力します。また、単一の(かなり大きい)データセットのための単一のラップトップ上の私の完全に非科学的なテストは、ソリューション2(fgrepを使用)よりもほぼ5倍速いソリューション1(commを使用)を示しました。

+0

私のファイルをソートしてuniqに渡しました。とにかく他のソリューションに感謝します。 – Sudar

2

diffは使用してはならない理由はわかりません。私は2つのファイルを比較して、左側のファイルにある行だけを出力し、右側のファイルは出力しません。このようなラインは、それがファイルがまだソートされない場合にはライン

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

'diff --new-line-format = --unchanged-line-format = a.txt b.txt'を使うと、新しく変更されていない行の印刷を抑止できます。 –

3

の先頭にそのシンボルをgrep検索すればよい<との差分によってフラグが立てられている、あなたが使用することができます。

comm -23 <(sort a.txt) <(sort b.txt) 
関連する問題