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.
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
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
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
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.
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.