Визначте повторювані блоки тексту у файлі


10

Чи є зручний спосіб виявити дублікат або поблизу дублікатів текстових блоків у файлі?

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

Я сподіваюся, що існує інструмент, схожий на diff, який може зробити своєрідний "diff у файлі" diff. Ще краще буде в одному файлі vimdiff.


Що vimdiffтут не робиться для вас?
slm

Тому що тут задіяний лише один файл. Я не знаю, як використовувати vimdiff для окремих частин одного файлу.
Праксеоліт

Бачу, я пропустив, що це один файл.
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для розбиття тексту на абзаци (окреслені порожніми рядками), перетворення нових рядків у пробіли, а потім передає вихід, по одному рядку за абзацом, для сортування та uniq для підрахунку дублюваних абзаців.

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


1
Я б хотів подати заявку на кілька рядків одночасно.
Праксеоліт

1
@Praxeolitic Оновлено для абзаців.
John1024
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.