a.txt
2 つのファイル ( ととしましょうb.txt
) があり、どちらにも名前のリストがあります。私はすでにsort
両方のファイルで実行しています。
a.txt
に存在しない行を見つけたいと思いますb.txt
。
(この質問の答えを見つけるのに多くの時間を費やしたので、将来の参考のために文書化します)
a.txt
2 つのファイル ( ととしましょうb.txt
) があり、どちらにも名前のリストがあります。私はすでにsort
両方のファイルで実行しています。
a.txt
に存在しない行を見つけたいと思いますb.txt
。
(この質問の答えを見つけるのに多くの時間を費やしたので、将来の参考のために文書化します)
使用する必要があるコマンドはありませんdiff
が、comm
comm -23 a.txt b.txt
デフォルトでは、left-only、right-only、bothcomm
の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:-u
(一意の) フラグを使用してsort
:
comm -13 <(sort -u file1) <(sort -u file2)
解決策 2: (私が見つけた最初の「有効な」回答) unix.stackexchangeから:
fgrep -v -f file1 file2
file2 に file1 にはまったく存在しない重複行が含まれている場合、fgrep
は各重複行を出力することに注意してください。また、単一の (かなり大きな) データセットに対する単一のラップトップでの完全に非科学的なテストでは、ソリューション 1 ( を使用comm
) がソリューション 2 ( を使用) よりもほぼ 5 倍高速であることが示されたことにも注意してくださいfgrep
。
diff
なぜ使用してはいけないと言われているのかわかりません。これを使用して 2 つのファイルを比較し、右側のファイルではなく左側のファイルにある行のみを出力します。そのような行は diff によってフラグが付けられる<
ため、行の先頭でそのシンボルを grep するだけで十分です
diff a.txt b.txt | grep \^\<
ファイルがまだソートされていない場合は、次を使用できます。
comm -23 <(sort a.txt) <(sort b.txt)