128

a.txt2 つのファイル ( ととしましょうb.txt) があり、どちらにも名前のリストがあります。私はすでにsort両方のファイルで実行しています。

a.txtに存在しない行を見つけたいと思いますb.txt

(この質問の答えを見つけるのに多くの時間を費やしたので、将来の参考のために文書化します)

4

4 に答える 4

211

使用する必要があるコマンドはありませんdiffが、comm

comm -23 a.txt b.txt

デフォルトでは、left-onlyright-onlybothcommの3 つの列を出力します。、およびスイッチは、これらの列を非表示にします。-1-2-3

したがって、右のみ両方の列を非表示にし、最初 (左) のファイルにのみ表示される行を表示します-23

両方に表示される行を見つけたい場合は、を使用できます-12。これにより、のみの列と右のみの列が非表示になり、両方の列だけが残ります。

于 2013-01-23T05:32:39.723 に答える
40

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

于 2014-09-30T20:50:42.923 に答える
17

diffなぜ使用してはいけないと言われているのかわかりません。これを使用して 2 つのファイルを比較し、右側のファイルではなく左側のファイルにある行のみを出力します。そのような行は diff によってフラグが付けられる<ため、行の先頭でそのシンボルを grep するだけで十分です

diff a.txt b.txt  | grep \^\<
于 2016-06-19T09:30:32.937 に答える
11

ファイルがまだソートされていない場合は、次を使用できます。

comm -23 <(sort a.txt) <(sort b.txt)
于 2017-07-21T11:30:56.697 に答える