Определите дубликаты блоков текста в файле

10

Есть ли удобный способ идентифицировать дубликаты или почти повторяющиеся блоки текста в файле?

Я хочу использовать это для выявления дублирования кода. Похоже, есть специальные программы с этой возможностью, но я не собираюсь вовлекаться в это.

Я надеюсь, что есть инструмент, похожий на diff, который может сделать своего рода "внутри файла" diff. Еще лучше было бы в пределах одного файла vimdiff.

Praxeolitic
источник
Что не подходит vimdiffдля вас здесь?
СЛМ
Потому что там задействован только один файл. Я не знаю, как использовать vimdiff на отдельных частях одного и того же файла.
Праксеолит
Я вижу, я пропустил, что это был один файл.
СЛМ

Ответы:

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для разбиения текста на абзацы (выделенные пустыми строками), преобразует символы новой строки в пробелы, а затем передает выходные данные, по одной строке на абзац, для сортировки и удаления для подсчета дублированных абзацев.

Выше было проверено с GNU awk. Для других awkметод определения пустых строк как границ абзаца (записи) может отличаться.

John1024
источник
1
Я бы проголосовал за несколько строк одновременно.
Праксеолит
1
@Praxeolitic Обновлено для абзацев.
Иоанна 1024