2つのファイル(a.txt
とb.txt
と言う)があり、どちらにも名前のリストがあります。すでに両方のファイルでsort
を実行しています。
a.txt
にはないb.txt
の行を見つけたいと思います。
(私はこの質問の答えを見つけるのに多くの時間を費やしたので、将来の参考のためにそれを文書化します)
使用する必要があるコマンドはdiff
ではなく、comm
です。
comm -23 a.txt b.txt
デフォルトでは、comm
は3列を出力します:左のみ、右のみ、両方。 -1
、-2
、および-3
スイッチは、これらの列を抑制します。
したがって、-23
はright-onlyおよびboth列を非表示にし、最初の(左)ファイルにのみ表示される行を表示します。
両方に表示される行を検索する場合は、-12
を使用できます。これにより、左のみ列と右のみ列が非表示になり、 both列。
comm
が行ごとに一致することを知らなかったため、単純な答えは私にはうまくいきませんでした。たとえば、file1に含まれている場合:
_Alex
Bill
Fred
_
File2には次が含まれます。
_Alex
Bill
Bill
Bill
Fred
_
次に、_comm -13 file1 file2
_が出力します:
_Bill
Bill
_
私の場合、各ファイルでその行が何回発生したかに関係なく、file2のすべての文字列がfile1に存在することだけを知りたいと思いました。
解決策1:_-u
_(一意)フラグを使用してsort
に:
comm -13 <(sort -u file1) <(sort -u file2)
解決策2:(私が見つけた最初の「動作する」答え)from nix.stackexchange :
_fgrep -v -f file1 file2
_
File2にfile1にまったく存在しない重複行が含まれている場合、fgrep
は重複行をそれぞれ出力することに注意してください。また、単一の(かなり大きい)データセットに対する単一のラップトップでの完全に非科学的なテストでは、ソリューション1(comm
を使用)がソリューション2(fgrep
を使用して) )。
diff
を使用すべきでないと言われた理由はわかりません。これを使用して2つのファイルを比較し、左側のファイルにはあるが右側のファイルにはない行のみを出力します。そのような行は<
でdiffによってフラグが立てられるため、行の先頭でそのシンボルをgrepするだけで十分です。
diff a.txt b.txt | grep \^\<
ファイルがまだソートされない場合は、次を使用できます。
comm -23 <(sort a.txt) <(sort b.txt)