Identifique blocos de texto duplicados em um arquivo

10

Existe uma maneira conveniente de identificar blocos duplicados ou quase duplicados de texto em um arquivo?

Eu quero usar isso para identificar a duplicação de código. Parece que existem programas especiais com esse recurso, mas não pretendo envolvê-lo.

Espero que exista uma ferramenta semelhante ao diff que possa fazer uma espécie de diff "dentro de um arquivo". Melhor ainda seria um vimdiff em um único arquivo.

Praxeolitic
fonte
O que não vimdifffaz por você aqui?
Slm
Porque há apenas um arquivo envolvido. Não sei como usar o vimdiff em partes separadas do mesmo arquivo.
Praxeolitic
Percebi que era um único arquivo.
Slm

Respostas:

13

Se a comparação linha por linha for aceitável, o seguinte dirá quais linhas são duplicadas no arquivo texte quantas vezes cada uma aparece:

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

Como um exemplo,

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

Usando as ferramentas usuais do unix, isso pode ser estendido, assumindo que o formato do teste de entrada não seja muito complexo, para comparações parágrafo por parágrafo ou sentença por sentença.

Localizando parágrafos repetidos

Suponha que nosso arquivo textcontenha:

This is a paragraph.

This is another
paragraph

This is
a paragraph.

Last sentence.

O comando a seguir identifica mostra quais parágrafos aparecem mais de uma vez:

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

Isso é usado awkpara dividir o texto em parágrafos (delineados por linhas em branco), converte as novas linhas em espaços e passa a saída, uma linha por parágrafo, para classificar e uniq para contar parágrafos duplicados.

O acima foi testado com GNU awk. Para outros awk, o método para definir linhas em branco como limites de parágrafo (registro) pode ser diferente.

John1024
fonte
1
Eu votaria em várias linhas por vez.
Praxeolitic
1
@Praxeolitic Atualizado para parágrafos.
precisa saber é o seguinte