Diffは、2つのファイル間の変更を表示するための優れたツールです。しかし、2つのテキストファイルの類似性を(違いを無視して)表示する方法は?
つまり入力例:
a:
Foo Bar
X
Hello
World
42
b:
Foo Baz
Hello
World
23
疑似出力(このようなもの):
@@ 2,3
=Hello World
両方のファイルを並べ替えてcommを使用するだけでは不十分です。その場合、行情報が失われるためです。
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
grep -Fxf file1 file2
-F
は、(正規表現ではなく)プレーンな文字列に一致することを意味し、-x
は行全体の一致のみを意味し、-f
は、引数として指定されたファイルから「パターン」(つまり、行)を取得することを意味します
あなたがやりたいことをする単一のコマンドはないと思います。ただし、diff
の出力をgrep
と組み合わせることができます。テキストファイルに|
、<
、>
のいずれの文字も含まれていない場合は、次のようにすると、多少役立つ出力が得られます。
$ diff --side-by-side a b | grep -n -v "[|<>]"
3:Hello Hello
4:World World
comm
を使用できます。 man comm
すべてのオプションで使用しますが、comm -12 ...
は、両方の入力に存在する行のみを表示します。
人々が指摘しているように、最初にsort
を介して入力を渡す必要があります。
Dick Gruneは、この種のことを行うための一連のツールを作成しました。
http://dickgrune.com/Programs/similarity_tester/
さまざまな言語の構文を解析するバージョンがあり、名前が変更された変数などは変更されていないものと見なすことができます。
DebianとUbuntuではsimilarity-tester
としてパッケージ化されています。