私は2つのファイルを持っています(例えば、a.txt
とb.txt
)。どちらも名前のリストを持っています。私はすでにsort
を両方のファイルで実行しています。ファイルから別のファイルに存在しない行を見つけよう
b.txt
に存在しないa.txt
の行を探したいと思います。
あなたが使用する必要があり、コマンドがdiff
ではなく、デフォルトでcomm
comm -23 a.txt b.txt
私は2つのファイルを持っています(例えば、a.txt
とb.txt
)。どちらも名前のリストを持っています。私はすでにsort
を両方のファイルで実行しています。ファイルから別のファイルに存在しない行を見つけよう
b.txt
に存在しないa.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
たかったです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
を使用)を示しました。
私のファイルをソートしてuniqに渡しました。とにかく他のソリューションに感謝します。 – Sudar
diff
は使用してはならない理由はわかりません。私は2つのファイルを比較して、左側のファイルにある行だけを出力し、右側のファイルは出力しません。このようなラインは、それがファイルがまだソートされない場合にはライン
diff a.txt b.txt | grep \^\<
'diff --new-line-format = --unchanged-line-format = a.txt b.txt'を使うと、新しく変更されていない行の印刷を抑止できます。 –
の先頭にそのシンボルをgrep検索すればよい<
との差分によってフラグが立てられている、あなたが使用することができます。
comm -23 <(sort a.txt) <(sort b.txt)
これは、両方のファイルがソートされている場合にのみ機能すると付け加えます。 (私はOPが彼がファイルをソートしたと知っていますが、多くの人が私を含めて、質問のタイトルを読んで答えにジャンプします) – user247866
@ user247866:幸いにもcommは親切で、ソートされていないかどうかを教えてくれます:) – marlar