共通の行を表示する方法(逆diff)?


170

異なる行ではなく、共通の行を知りたい一連のテキストファイルがあります。コマンドライン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)

ありがとう。


@ChristopherSchultz私の間違い。最初の例の最初の行は、2番目の例の最後の行と一致すると想定されています。間違いを見つけてくれてありがとう。変化。
マットウィルキー2015

1
良い答えを持つ別の同様の質問:unix.stackexchange.com/questions/1079/...
MortezaE

回答:


210

* 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. 

また、manページに記載されているように、commを使用する前にファイルをソートすることが重要であることにも注意してください。


3
comm [-1] [-2] [-3] file1 file2 -1 file1に固有の行の出力列を抑制します。-2 file2に固有の行の出力列を抑制します。-3 file1とfile2に重複する行の出力列を抑制します。
ojblass 2009

@ojblass:これを回答に追加しました。
Matt J

6
commを使用する前にファイルをソートすることが重要であることを発見しました。おそらくそれを答えに追加してください。
マット・ウィルキー2009

11
質問への短い回答:comm -1 -2 file1 file2
greggles

6
これは、ファイルがソートされていない場合に使用できます。comm-1 -2 <(sort filename1)<(sort filename2)
Kevin Wheeler

56

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

grep -F -x -f file1 file2

または簡略化されたfgrepバージョン

fgrep -xf file1 file2

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

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

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

使用する方commが高速ですが、その速度は、最初にファイルをソートする必要があるという犠牲を伴います。「逆差分」としてはあまり役に立ちません。


ライダーのおかげで、これは多くの人にとってcommよりも役立つでしょう。ソースの回答にリンクする必要があります(右側のナビゲーションのQには6ダース以上のリンクがあります。見つけるのは少し面倒です)。また、grepがソートされていない入力または異なるソートされた入力に対してどの程度うまく機能し、一致のそれぞれの行番号を出力できるかを知っているとよいでしょう。
マットウィルキー

1
@mattwilkie自分で-vフラグを上げた後、フラグの使用方法を明らかにして戻る必要があると感じました。たとえば、2つのcsvファイルfile1とfile2があり、それらには重複する行と重複しない行の両方があるとします。すべての非重複行のみが必要な場合、を使用fgrep -v file1 file2すると、file2の非重複行のみが返され、file1の追加の非重複行は返されません。これは一部の人にとっては明白かもしれませんが、リスクの誤解よりも明白なものを述べる方が良いでしょう。この特定のケースでは、ファイルを並べ替えて使用することをお勧めしますcomm
ライダー

1
戻ってきてライダーを明確にしてくれてありがとう。特別な注意が示され、高く評価されています(古いものを簡単に取り除くことができます!)。個人的にはソートが望ましくないオーバーヘッドである場合でもこれを使用していますが、commは明らかにコミュニティの選択であるため、受け入れられた回答を切り替えました。
マットウィルキー

2
使用時の別の複雑さgrep:最初のファイルの空白行は、2番目のファイルのすべての行と一致します。file1空白行がないことを確認してください。そうしないと、ファイルが同一であるように見えます。
クリストファーシュルツ

grep -Fxfそれは私のためです。
loxaxs 2018年

35

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

あなたはperlで試すこともできます(クレジットはここにあります

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

1
ありがとう。perl oneライナーはクロスプラットフォームなので、私は両方の答えを受け入れたいと思います。Commの方が簡単なので、うなずきます。
マット・ウィルキー

1
完璧です。Windowsでのcygwinターミナルの使用commは、すぐには利用できませんでした。これは完璧な選択肢でした。
Qix-モニカは

3
これは、行がどのように並べられているかは関係ありません。通信よりも正確です。
enl8enmentnow 2013


17

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

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

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

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

9

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

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

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


1
これは、ソーステンプレートを再構築できるという点で、ここでのほとんどの回答とは異なります。同じラッパーから構築された2つのファイルがあり、数箇所に異なるテキストが挿入されています。この答えにより、ラッパーを回復できました。
Lucas Gonze

1

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

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

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

ソースコードも入手可能(GPL)


1

Windowsを使用できPowerShellのでスクリプトをCompareObject

compare-object -IncludeEqual -ExcludeDifferent -PassThru (get-content A.txt) (get-content B.txt)> MATCHING.txt | Out-Null #Find Matching Lines

CompareObject:

  • IncludeEqual -ExcludeDifferentなし:すべて
  • -InclueEqualなしのExcludeDifferent:なし
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.