Identifica blocchi duplicati di testo all'interno di un file


10

Esiste un modo conveniente per identificare blocchi di testo duplicati o quasi duplicati all'interno di un file?

Voglio usarlo per identificare la duplicazione del codice. Sembra che ci siano programmi speciali con questa capacità, ma non sto cercando di coinvolgerlo.

Spero che ci sia uno strumento simile a diff che possa fare una sorta di diff "all'interno di un file". Ancora meglio sarebbe un all'interno di un singolo file vimdiff.


Cosa vimdiffnon fa per te qui?
slm

Perché c'è solo un file coinvolto. Non so come usare vimdiff su parti separate dello stesso file.
Prassolitico

Vedo, mi mancava che fosse un singolo file.
slm

Risposte:


13

Se è accettabile eseguire il confronto riga per riga, quindi quanto segue indicherà quali righe sono duplicate nel file texte quante volte ciascuna appare:

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

Come esempio,

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

Usando i soliti strumenti unix, questo potrebbe essere esteso, supponendo che il formato del test di input non sia troppo complesso, per i confronti paragrafo per paragrafo o frase per frase.

Trovare paragrafi ripetuti

Supponiamo che il nostro file textcontenga:

This is a paragraph.

This is another
paragraph

This is
a paragraph.

Last sentence.

Il seguente comando identifica mostra quali paragrafi appaiono più di una volta:

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

Questo utilizza awkper suddividere il testo in paragrafi (delineati da righe vuote), converte le nuove righe in spazi, quindi passa l'output, una riga per paragrafo, per ordinare e unire per il conteggio dei paragrafi duplicati.

Quanto sopra è stato testato con GNU awk. Per altri awk, il metodo per definire le righe vuote come limiti di paragrafo (record) può differire.


1
Voterei per più righe alla volta.
Prassolitico

1
@Praxeolitic Aggiornato per i paragrafi.
Giovanni 1024
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.