Identificar bloques de text duplicates dentro de un file

¿Existe una manera conveniente de identificar bloques de text duplicates o casi duplicates dentro de un file?

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

Espero que haya una herramienta similar a diff que pueda hacer una especie de diferencia "dentro de un file". Incluso mejor sería un vimdiff dentro de un único file.

Si hacer la comparación línea por línea es aceptable, lo siguiente dirá qué líneas están duplicadas en el text file y 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 de Unix usuales, esto podría extenderse, asumiendo que el formatting de testing de input no es demasiado complejo, para comparaciones de párrafo por párrafo o oración por oración.

Encontrar párrafos repetidos

Supongamos que nuestro text file contiene:

 This is a paragraph. This is another paragraph This is a paragraph. Last sentence. 

El siguiente command 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 utiliza awk para dividir el text en párrafos (delineados por líneas en blanco), convierte los saltos en espacios y luego pasa el resultado, una línea por párrafo, para orderar y uniq para contar los párrafos duplicates.

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