识别文件中的重复文本块

Pra*_*tic 11 diff text-processing vimdiff

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

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

我希望有一个类似于 diff 的工具可以做一种“文件内”差异。更好的是在单个文件中使用 vimdiff。

Joh*_*024 14

如果逐行进行比较是可以接受的,那么以下内容将说明文件中哪些行重复text以及每行出现了多少次:

sort text | uniq -c | grep -vE '^\s*1 '
Run Code Online (Sandbox Code Playgroud)

举个例子,

$ cat text
alpha
beta
alpha
gamma
alpha
beta
$ sort text | uniq -c | grep -vE '^\s*1 '
      3 alpha
      2 beta
Run Code Online (Sandbox Code Playgroud)

使用通常的 unix 工具,假设输入测试格式不是太复杂,这可以扩展到逐段或逐句比较。

查找重复的段落

假设我们的文件text包含:

This is a paragraph.

This is another
paragraph

This is
a paragraph.

Last sentence.
Run Code Online (Sandbox Code Playgroud)

以下命令标识显示哪些段落出现多次:

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

这用于awk将文本分成段落(由空行划定),将换行符转换为空格,然后将输出(每个段落一行)传递给 sort 和 uniq 以计算重复段落。

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

  • 我会一次投票支持多行。 (3认同)