有没有一种方便的方法来识别文件中重复或接近重复的文本块?
我想用它来识别代码重复。似乎有具有此功能的专业程序,但我不希望参与其中。
我希望有一个类似于 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
将文本分成段落(用空行划分),将换行符转换为空格,然后将输出(每段落一行)传递到排序和 uniq 以计算重复的段落。
以上内容已使用 GNU 进行了测试awk
。对于其他awk
的,将空行定义为段落(记录)边界的方法可能不同。