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
Pseudo saída (algo como isto):
@@ 2,3
=Hello World
Apenas classificar os dois arquivos e usar comm não é suficiente, porque nesse caso as informações da linha são perdidas.
command-line
shell
diff
maxschlepzig
fonte
fonte
...%df'$'\n''%<'...
... --unchanged-group-format="@@ %dn,%df%c'\012'%<" ...
(Observe as aspas duplas.)which diff
para ver se este é o seu problema.-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 argumentofonte
-f
e são-F
trocados? Pelo menos na minhagrep
versão é assim. Eu preciso fornecerfile2
entrada para o-f
argumento, comocat file1 | grep -Fxf file2
, e depois funciona.comm
pode ser usado.man comm
para todas as opções, mas convém usarcomm -12 ...
para mostrar apenas as linhas existentes nas duas entradas.Como as pessoas apontaram, você precisa passar sua opinião
sort
primeiro.fonte
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
comgrep
, no entanto. Se os seus arquivos de texto contêm nenhum dos personagens|
,<
,>
, o seguinte lhe dá saída um pouco útil:fonte
diff --width=155 --left-column --side-by-side a b | grep -n -v '|' | sed 's/ *($//'
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.fonte