ファイル内で繰り返されるテキストブロックの識別

ファイル内で繰り返されるテキストブロックの識別

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

コードの重複を識別するために使用したいと思います。この機能を備えたプロのプログラムがあるようですが、私は参加したくありません。

一種の「ファイル内」比較を行うことができるdiffのようなツールがあってほしいです。より良い方法は、単一のファイル内でvimdiffを使用することです。

答え1

行ごとの比較が許可されている場合、以下はファイル内でどの行が繰り返され、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行)を並べ替え、uniqを渡して重複する段落を計算するために使用されます。

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

関連情報