it-swarm-pt.tech

Saída as linhas comuns (semelhanças) de dois arquivos de texto (o oposto de diff)?

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)?

I.e. entrada de amostra:

a:
Foo Bar
X
Hello
World
42

b:
Foo Baz
Hello
World
23

Pseudo saída (algo como isto):

@@ 2,3
=Hello World

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

23
maxschlepzig

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

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

Aqui está 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
24
Mike Gray
grep -Fxf file1 file2

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

15
tobyodavies

Eu não acho que exista um único comando que faça o que você deseja que ele faça. Você pode tentar combinar a saída de diff com grep, no entanto. Se seus arquivos de texto não contiverem nenhum dos caracteres |, <, >, o seguinte fornece uma saída útil:

$ diff --side-by-side a b | grep -n -v "[|<>]"
3:Hello                             Hello
4:World                             World
8
Marcel Stimberg

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

Como as pessoas apontaram, você precisa passar sua entrada por sort primeiro.

7
Oli

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

http://dickgrune.com/Programs/similarity_tester/

Existem versões que analisam a sintaxe de vários idiomas, para que coisas como variáveis ​​renomeadas possam ser vistas como inalteradas.

É empacotado como similarity-tester no Debian e Ubuntu.

2
Douglas Bagnall