Produz as linhas comuns (semelhanças) de dois arquivos de texto (o oposto de diff)?

15

O diff é uma ótima ferramenta para exibir as alterações entre dois arquivos. Mas como exibir as semelhanças de dois arquivos de texto (ignorando as diferenças)?

Ou seja. entrada de amostra:

a:
Foo Bar
X
Hello
World
42

b:
Foo Baz
Hello
World
23

Saída pseudo (algo assim):

@@ 2,3
=Hello World

Apenas classificar os arquivos e usar comm não é suficiente, porque, nesse caso, as informações de linha são perdidas.

    
por maxschlepzig 23.08.2010 / 16:45

5 respostas

19

Que tal usar o diff, mesmo que você não queira um diff? Tente isto:

diff --unchanged-group-format='@@ %dn,%df 
  %<' --old-group-format='' --new-group-format='' \
  --changed-group-format='' a.txt b.txt

Veja o que recebo com seus dados de amostra:

$ cat a.txt 
Foo Bar
X
Hello
World
42
$ cat b.txt 
Foo Baz
Hello
World
23
$ diff --unchanged-group-format='@@ %dn,%df
%<' --old-group-format='' --new-group-format='' \
  --changed-group-format='' a.txt b.txt
@@ 2,3
Hello
World
    
por 23.08.2010 / 19:42
11
grep -Fxf file1 file2

-F significa corresponder a strings simples (não regexps), -x significa apenas correspondências de linha inteira, -f significa obter 'padrões' (ou seja, linhas) do arquivo chamado como seu argumento

    
por 14.10.2010 / 02:11
6

Eu não acho que há um único comando que faz o que você quer fazer. Você pode tentar combinar a saída de diff com grep . Se seus arquivos de texto não contiverem nenhum dos caracteres | , < , > , o seguinte fornecerá uma saída útil:

$ diff --side-by-side a b | grep -n -v "[|<>]"
3:Hello                             Hello
4:World                             World
    
por 23.08.2010 / 17:16
4

comm pode ser usado. man comm para todas as opções, mas você vai querer usar comm -12 ... para mostrar apenas as linhas existentes nas duas entradas.

Como as pessoas apontaram, você precisa passar sua entrada através de sort primeiro.

    
por 23.08.2010 / 16:52
2

Dick Grune escreveu uma família de ferramentas para esse tipo de coisa:

link

Existem versões que analisam a sintaxe de várias linguagens, de modo que coisas como variáveis renomeadas podem ser vistas como inalteradas.

É empacotado como similarity-tester no Debian e no Ubuntu.

    
por 11.10.2013 / 00:24