识别文件中的重复文本块


10

是否有一种简便的方法来识别文件中重复的文本或接近重复的文本块?

我想用它来识别代码重复。看起来有些专业程序具有此功能,但我不想参与其中。

我希望有一个类似于diff的工具,可以进行某种“文件内”比较。甚至更好的是在单个文件中的vimdiff。


什么东西不能vimdiff没有你在这里做?
slm

因为只涉及一个文件。我不知道如何在同一文件的不同部分上使用vimdiff。
Praxeolitic

我知道了,我错过了它是一个文件。
slm

Answers:


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将文本分成段落(由空行表示),将换行符转换为空格,然后将输出(每个段落一行)传递给sort和uniq以对重复的段落进行计数。

以上是通过GNU测试的awk。对于其他awk的,将空白行定义为段落(记录)边界的方法可能有所不同。


1
我会同时投票多行。
Praxeolitic

1
@Praxeolitic已更新段落。
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.