web-dev-qa-db-ja.com

共通の行を表示する方法(逆差分)

一連のテキストファイルがあり、それらの間で異なる行ではなく、共通する行を知りたいです。コマンドラインUNIXまたはWindowsで問題ありません。

foo:

linux-vdso.so.1 =>  (0x00007fffccffe000)
libvlc.so.2 => /usr/lib/libvlc.so.2 (0x00007f0dc4b0b000)
libvlccore.so.0 => /usr/lib/libvlccore.so.0 (0x00007f0dc483f000)
libc.so.6 => /lib/libc.so.6 (0x00007f0dc44cd000)

バー:

libkdeui.so.5 => /usr/lib/libkdeui.so.5 (0x00007f716ae22000)
libkio.so.5 => /usr/lib/libkio.so.5 (0x00007f716a96d000)
linux-vdso.so.1 =>  (0x00007fffccffe000)

したがって、目的のユーティリティの出力の上にあるこれらの2つのファイルがfile1:line_number, file2:line_number == matching textに似ていることを考えると(単なる提案であり、構文はどうでも構いません)。

foo:1, bar:3 == linux-vdso.so.1 =>  (0x00007fffccffe000)

ありがとう。

162
matt wilkie

* nixでは、 comm を使用できます。質問に対する答えは次のとおりです。

comm -1 -2 file1.sorted file2.sorted 
# where file1 and file2 are sorted and piped into *.sorted

commの完全な使用法は次のとおりです。

comm [-1] [-2] [-3 ] file1 file2
-1 Suppress the output column of lines unique to file1.
-2 Suppress the output column of lines unique to file2.
-3 Suppress the output column of lines duplicated in file1 and file2. 

また、マニュアルページに記載されているように、commを使用する前にファイルをソートすることが重要です。

196
Daniel Lew

重複としてリストされている質問 でこの回答を見つけました。 grepはcommよりも管理しやすいため、一致する行のセット(たとえば、CSVの比較に便利)だけが必要な場合は、

grep -F -x -f file1 file2

または簡易fgrepバージョン

fgrep -xf file1 file2

さらに、file2*を使用して、2つだけではなく、複数のファイルに共通する行をグロブして検索できます。

いくつかの他の便利なバリエーションが含まれます

  • -nフラグは、一致した各行の行番号を表示します
  • -cは、一致する行数のみをカウントします
  • -vは、file2と異なる行のみを表示します(またはdiffを使用します)。

commを使用すると高速になりますが、その速度はファイルを最初にソートする必要があります。 「リバースdiff」としてはあまり有用ではありません。

46
Ryder

前にここで尋ねられました: 2つのファイルに共通する行を見つけるためのUNIXコマンド

Perlを試すこともできます(credit goes here

Perl -ne 'print if ($seen{$_} .= @ARGV) =~ /10$/'  file1 file2
33
ChristopheD

私はこのスレッドからcommコマンドを学習しましたが、さらに何かを追加したかったです。ファイルがソートされておらず、元のファイルに触れたくない場合は、sortコマンドの出力をパイプすることができます。これにより、元のファイルはそのまま残ります。 bashで動作します。他のシェルについては言えません。

comm -1 -2 <(sort file1) <(sort file2)

これは、ファイルの代わりにコマンド出力を比較するために拡張できます。

comm -1 -2 <(ls /dir1 | sort) <(ls /dir2 | sort)
16
Greg Mueller

最も簡単な方法は次のとおりです。

awk 'NR==FNR{a[$1]++;next} a[$1] ' file1 file2

ファイルをソートする必要はありません。

6
Gopu

参考までに、Windowsで「grep -F -x -f file1 file2」と同じことを行う小さなツールを作成しました(Windowsでこのコマンドに相当するものが見つからないため)

ここにあります: http://www.nerdzcore.com/?page=commonlines

使用法は「CommonLines inputFile1 inputFile2 outputFile」です

ソースコードも利用可能(GPL)

1
Zivilyn Bane