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


10

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

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

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


vimdiffここであなたにしてはいけないことは何ですか?
slm

関係するファイルは1つしかないためです。同じファイルの別々の部分でvimdiffを使用する方法がわかりません。
Praxeolitic 2014年

なるほど、それが単一のファイルであることを逃しました。
slm

回答:


13

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のについては、空白行を段落(レコード)境界として定義する方法が異なる場合があります。


1
一度に複数行に賛成票を投じます。
Praxeolitic 2014年

1
@Praxeolitic段落用に更新されました。
John1024 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.