Identifica blocos duplicados de texto dentro de um arquivo

9

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

Eu quero usar isso para identificar a duplicação de código. Parece que existem programas especializados com essa capacidade, mas não estou querendo envolver isso.

Espero que haja uma ferramenta parecida com diff que possa fazer uma espécie de "dentro de um arquivo" diff. Ainda melhor seria um dentro de um único arquivo vimdiff.

    
por Praxeolitic 01.10.2014 / 04:48

1 resposta

13

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

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

Como 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, supondo que o formato do teste de entrada não seja muito complexo, para comparações parágrafo por parágrafo ou frase por sentença.

Como encontrar parágrafos repetidos

Suponha que nosso arquivo text contenha:

This is a paragraph.

This is another
paragraph

This is
a paragraph.

Last sentence.

O seguinte comando identifica os parágrafos que 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 usa awk para dividir o texto em parágrafos (delineado 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 o% GNUawk. Para outros awk , o método para definir linhas em branco como limites de parágrafo (registro) pode ser diferente.

    
por 01.10.2014 / 04:57