2つのテキストファイル(diffの反対)の共通行(類似性)を出力しますか?


20

Diffは、2つのファイル間の変更を表示するための優れたツールです。しかし、2つのテキストファイルの類似性を表示する方法(違いを無視しながら)?

すなわち、サンプル入力:

a:
Foo Bar
X
Hello
World
42

b:
Foo Baz
Hello
World
23

擬似出力(次のようなもの):

@@ 2,3
=Hello World

両方のファイルをソートして通信を使用するだけでは十分ではありません。その場合、行情報が失われるためです。

回答:


24

diffが必要ない場合でも、diffを使用してはどうですか?これを試して:

diff --unchanged-group-format='@@ %dn,%df 
  %<' --old-group-format='' --new-group-format='' \
  --changed-group-format='' a.txt b.txt

サンプルデータで得られるものを次に示します。

$ cat a.txt 
Foo Bar
X
Hello
World
42
$ cat b.txt 
Foo Baz
Hello
World
23
$ diff --unchanged-group-format='@@ %dn,%df
%<' --old-group-format='' --new-group-format='' \
  --changed-group-format='' a.txt b.txt
@@ 2,3
Hello
World

2
:あなたはこのようなリテラルの改行埋め込む回避することができます...%df'$'\n''%<'...
追って通知があるまで一時停止します。

1
また、次のようにすることもできます:(... --unchanged-group-format="@@ %dn,%df%c'\012'%<" ...二重引用符に注意してください。)
追って通知があるまで一時停止します。

素晴らしいもの!これらのオプションは知りませんでした
。diffの

diff --version diff(GNU diffutils)2.8.1を使用しています。次のエラーが表示されます。diff:コンフリクトしている出力スタイルオプション
スジェイ14

diffエイリアスが定義されていたため、「エラー:diff:競合する出力スタイルオプションdiff」が表示されていました。which diffこれが問題かどうかを確認するために使用します。
justinjhendrick

14
grep -Fxf file1 file2

-F(正規表現で-xはなく)プレーン文字列に一致-fすることを意味し、行全体に一致することのみを意味し、引数として指定されたファイルから「パターン」(つまり行)を取得することを意味します


3
されているわけではない-f-F交換?。少なくとも私のgrepバージョンではそうです。のように、引数にfile2入力を提供する必要があり、それから動作します。-fcat file1 | grep -Fxf file2
ビレイ

これは私にはうまくいきません。
チャミンダバンダラ

7

あなたがやりたいことをする単一のコマンドがあるとは思わない。ただし、diffとの出力を組み合わせてみることができgrepます。あなたのテキストファイルが文字のいずれを含まない場合は|<>、次のことがあなたにやや有用な出力が得られます。

$ diff --side-by-side a b | grep -n -v "[|<>]"
3:Hello                             Hello
4:World                             World

これをお試しください:diff --width=155 --left-column --side-by-side a b | grep -n -v '|' | sed 's/ *($//'
追って通知があるまで一時停止しました。

見た目は良くなりますが、どちらのファイルの追加行も削除するには、grepに<と>を含める必要があります。
マルセルスティムバーグ

6

commに使える。man commすべてのオプションで使用できますcomm -12 ...が、両方の入力に存在する行のみを表示する場合に使用します。

人々が指摘したように、sort最初に入力を渡す必要があります。


1
ふむ、これは両方のファイルで同じ行番号にある共通行でのみ機能します。
maxschlepzig

2
commはソートされたファイル専用であり、OPのユースケースに有用な出力を提供しないようです。彼の例:$のCOMM -12 ABのHello World COMM:ファイル1は、ソート順のCOMMではありません:ファイル2は、ソート順ではありません
マルセルStimberg

@maxschlepzig:commに渡す前にファイルをソートする必要があります。
ヘマント

2
ただし、並べ替えを行うと、共通行の位置に関するすべての情報が削除されます。diffと比較する前にファイルをソートすることもありません。
マルセルスティムバーグ

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