ファイル内のテキストの重複または重複に近いブロックを識別する便利な方法はありますか?
これをコードの重複を識別するために使用したいと思います。この機能を備えた専門プログラムがあるようですが、私はそれを関与させるつもりはありません。
ある種の「ファイル内」diffを実行できるdiffに似たツールがあることを望んでいます。さらに良いのは、単一ファイルのvimdiff内です。
行ごとに比較を行うことが許容できる場合は、次のようにして、ファイル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
の場合、空白行を段落(レコード)の境界として定義する方法は異なる場合があります。