web-dev-qa-db-ja.com

ファイル内の重複するテキストブロックを特定する

ファイル内のテキストの重複または重複に近いブロックを識別する便利な方法はありますか?

これをコードの重複を識別するために使用したいと思います。この機能を備えた専門プログラムがあるようですが、私はそれを関与させるつもりはありません。

ある種の「ファイル内」diffを実行できるdiffに似たツールがあることを望んでいます。さらに良いのは、単一ファイルのvimdiff内です。

10
Praxeolitic

行ごとに比較を行うことが許容できる場合は、次のようにして、ファイルtextで重複している行と、各行が何回出現するかがわかります。

sort text | uniq -c | grep -vE '^\s*1 '

例として、

$ cat text
alpha
beta
alpha
gamma
alpha
beta
$ sort text | uniq -c | grep -vE '^\s*1 '
      3 alpha
      2 beta

通常のUNIXツールを使用すると、入力テスト形式が複雑すぎない場合、段落ごとまたは文ごとの比較に拡張できます。

繰り返される段落を見つける

ファイルtextに次のものが含まれているとします。

This is a paragraph.

This is another
paragraph

This is
a paragraph.

Last sentence.

次のコマンドは、どの段落が複数回表示されるかを示します。

$ awk -v RS=""  '{gsub(/\n/," "); print}' text | sort | uniq -c | grep -vE '^\s*1 '
      2 This is a paragraph.

これは、awkを使用してテキストを段落(空白行で示される)に分割し、改行をスペースに変換してから、出力を段落ごとに1行渡し、重複した段落をカウントするための並べ替えと一意化を行います。

上記は、GNU awkでテストされました。他のawkの場合、空白行を段落(レコード)の境界として定義する方法は異なる場合があります。

13
John1024