一連のテキストファイルがあり、それらの間で異なる行ではなく、共通する行を知りたいです。コマンドライン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)
ありがとう。
* 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を使用する前にファイルをソートすることが重要です。
重複としてリストされている質問 でこの回答を見つけました。 grepはcommよりも管理しやすいため、一致する行のセット(たとえば、CSVの比較に便利)だけが必要な場合は、
grep -F -x -f file1 file2
または簡易fgrepバージョン
fgrep -xf file1 file2
さらに、file2*
を使用して、2つだけではなく、複数のファイルに共通する行をグロブして検索できます。
いくつかの他の便利なバリエーションが含まれます
-n
フラグは、一致した各行の行番号を表示します-c
は、一致する行数のみをカウントします-v
は、file2と異なる行のみを表示します(またはdiff
を使用します)。comm
を使用すると高速になりますが、その速度はファイルを最初にソートする必要があります。 「リバースdiff」としてはあまり有用ではありません。
前にここで尋ねられました: 2つのファイルに共通する行を見つけるためのUNIXコマンド
Perlを試すこともできます(credit goes here )
Perl -ne 'print if ($seen{$_} .= @ARGV) =~ /10$/' file1 file2
私はこのスレッドからcommコマンドを学習しましたが、さらに何かを追加したかったです。ファイルがソートされておらず、元のファイルに触れたくない場合は、sortコマンドの出力をパイプすることができます。これにより、元のファイルはそのまま残ります。 bashで動作します。他のシェルについては言えません。
comm -1 -2 <(sort file1) <(sort file2)
これは、ファイルの代わりにコマンド出力を比較するために拡張できます。
comm -1 -2 <(ls /dir1 | sort) <(ls /dir2 | sort)
最も簡単な方法は次のとおりです。
awk 'NR==FNR{a[$1]++;next} a[$1] ' file1 file2
ファイルをソートする必要はありません。
参考までに、Windowsで「grep -F -x -f file1 file2」と同じことを行う小さなツールを作成しました(Windowsでこのコマンドに相当するものが見つからないため)
ここにあります: http://www.nerdzcore.com/?page=commonlines
使用法は「CommonLines inputFile1 inputFile2 outputFile」です
ソースコードも利用可能(GPL)