web-dev-qa-db-ja.com

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

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

つまり入力例:

a:
Foo Bar
X
Hello
World
42

b:
Foo Baz
Hello
World
23

疑似出力(このようなもの):

@@ 2,3
=Hello World

両方のファイルを並べ替えてcommを使用するだけでは不十分です。その場合、行情報が失われるためです。

23
maxschlepzig

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
24
Mike Gray
grep -Fxf file1 file2

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

15
tobyodavies

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

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

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

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

7
Oli

Dick Gruneは、この種のことを行うための一連のツールを作成しました。

http://dickgrune.com/Programs/similarity_tester/

さまざまな言語の構文を解析するバージョンがあり、名前が変更された変数などは変更されていないものと見なすことができます。

DebianとUbuntuではsimilarity-testerとしてパッケージ化されています。

2
Douglas Bagnall