Diffは、2つのファイル間の変更を表示するための優れたツールです。しかし、2つのテキストファイルの類似性を表示する方法(違いを無視しながら)?
すなわち、サンプル入力:
a:
Foo Bar
X
Hello
World
42
b:
Foo Baz
Hello
World
23
擬似出力(次のようなもの):
@@ 2,3
=Hello World
両方のファイルをソートして通信を使用するだけでは十分ではありません。その場合、行情報が失われるためです。
Diffは、2つのファイル間の変更を表示するための優れたツールです。しかし、2つのテキストファイルの類似性を表示する方法(違いを無視しながら)?
すなわち、サンプル入力:
a:
Foo Bar
X
Hello
World
42
b:
Foo Baz
Hello
World
23
擬似出力(次のようなもの):
@@ 2,3
=Hello World
両方のファイルをソートして通信を使用するだけでは十分ではありません。その場合、行情報が失われるためです。
回答:
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
... --unchanged-group-format="@@ %dn,%df%c'\012'%<" ...
二重引用符に注意してください。)
which diff
これが問題かどうかを確認するために使用します。
あなたがやりたいことをする単一のコマンドがあるとは思わない。ただし、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/ *($//'
comm
に使える。man comm
すべてのオプションで使用できますcomm -12 ...
が、両方の入力に存在する行のみを表示する場合に使用します。
人々が指摘したように、sort
最初に入力を渡す必要があります。
ディック・グルーンは、この種のツールを作成しました。
http://dickgrune.com/Programs/similarity_tester/
さまざまな言語の構文を解析するバージョンがあり、名前が変更された変数などは変更されていないように見えます。
similarity-tester
DebianおよびUbuntuと同様にパッケージ化されています。
...%df'$'\n''%<'...