Identificar bloques duplicados de texto dentro de un archivo

10

¿Hay una manera conveniente de identificar bloques de texto duplicados o casi duplicados dentro de un archivo?

Quiero usar esto para identificar la duplicación de código. Parece que hay programas especializados con esta capacidad, pero no estoy buscando involucrarme.

Espero que haya una herramienta similar a diff que pueda hacer una especie de diff "dentro de un archivo". Aún mejor sería un vimdiff dentro de un solo archivo.

Praxeolítico
fuente
¿Qué vimdiffno hace por ti aquí?
slm
Porque solo hay un archivo involucrado. No sé cómo usar vimdiff en porciones separadas del mismo archivo.
Praxeolitic
Ya veo, me perdí que era un solo archivo.
slm

Respuestas:

13

Si hacer la comparación línea por línea es aceptable, lo siguiente le dirá qué líneas están duplicadas en el archivo texty cuántas veces aparece cada una:

sort text | uniq -c | grep -vE '^\s*1 '

Como ejemplo,

$ cat text
alpha
beta
alpha
gamma
alpha
beta
$ sort text | uniq -c | grep -vE '^\s*1 '
      3 alpha
      2 beta

Usando las herramientas habituales de Unix, esto podría extenderse, suponiendo que el formato de prueba de entrada no sea demasiado complejo, para comparaciones de párrafo por párrafo o de oración por oración.

Encontrar párrafos repetidos

Supongamos que nuestro archivo textcontiene:

This is a paragraph.

This is another
paragraph

This is
a paragraph.

Last sentence.

El siguiente comando identifica muestra qué párrafos aparecen más de una vez:

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

Esto se usa awkpara dividir el texto en párrafos (delineados por líneas en blanco), convierte las nuevas líneas en espacios y luego pasa la salida, una línea por párrafo, para ordenar y unificar para contar párrafos duplicados.

Lo anterior fue probado con GNU awk. Para otros awk, el método para definir líneas en blanco como límites de párrafo (registro) puede diferir.

John1024
fuente
1
Yo votaría por varias líneas a la vez.
Praxeolitic
1
@Praxeolitic Actualizado para párrafos.
John1024