Eu tenho 2 arquivos contendo uma lista de músicas. hdsongs.txt e sdsongs.txt
Eu escrevi um script simples para listar todas as músicas e produzir em arquivos de texto, para depois executar uma comparação. Na maioria das vezes, funciona bem, mas o comando diff real no script está mostrando a mesma linha como sendo diferente. Na verdade, isso está acontecendo para várias linhas, mas não para todas.
Aqui está um exemplo de uma música nos dois arquivos:
$ grep Apologize \*songs\*
hdsongs.txt:Timbaland/Apologize.mp3
sdsongs.txt:Timbaland/Apologize.mp3
Não há caracteres especiais à direita que eu possa ver:
$ cat -A hdsongs.txt sdsongs.txt | grep Apologize
Timbaland/Apologize.mp3$
Timbaland/Apologize.mp3$
Quando executo diff, ele mostra a mesma linha em cada arquivo; mas as linhas não são as mesmas?
$ diff hdsongs.txt sdsongs.txt | grep Apologize
> Timbaland/Apologize.mp3
< Timbaland/Apologize.mp3
Isso é semelhante ao tópico aqui: diff reporta que dois arquivos diferem, embora sejam iguais!
mas isso é para linhas dentro do arquivo, não para o arquivo inteiro, e a resolução não parece se encaixar nesse caso.
$ diff <(cat -A phonesongsonly.txt) <(cat -A passportsongsonly.txt) | grep Apologize
< Timbaland/Apologize.mp3$
> Timbaland/Apologize.mp3$
$ wdiff -w "$(tput bold;tput setaf 1)" -x "$(tput sgr0)" -y "$(tput bold;tput setaf 2)" -z "$(tput sgr0)" hdsongs.txt sdsongs.txt | grep Apologize
>Timbaland/Apologize.mp3
>Timbaland/Apologize.mp3
Alguém sabe por que o diff reportaria a mesma linha duas vezes assim?
hexdump
essas duas linhas e veja o que difere?Respostas:
Meu palpite é que você simplesmente não classificou os arquivos. Esse é um dos comportamentos que você pode obter em entradas não classificadas:
Mas, se você classificar:
O
diff
trabalho do programa é informar se dois arquivos são idênticos e, se não, onde eles diferem. Não foi projetado para encontrar semelhanças entre linhas diferentes. Se a linha X de um arquivo não for igual à linha X do outro, os arquivos não serão os mesmos. Não importa se eles contêm exatamente as mesmas informações, se essas informações são organizadas de maneira diferente, os arquivos são relatados como diferentes.fonte
Como você não declarou que os arquivos estão classificados, presumo que não. Esta é a saída esperada de
diff
quando uma linha aparece nos dois arquivos, mas em locais diferentes. Isso ficaria claro se você analisasse toda adiff
saída, em vez de transmiti-lagrep
.fonte
Eu sugeriria tentar usar algo como o programa hexdiff para obter uma saída binária / hexadecimal, pois o olho humano nem sempre pode dizer a diferença entre os caracteres que um computador exibe, e alguns caracteres podem não ser exibidos.
fonte
cat -A
teria mostrado a maioria (todos?) casos de caracteres não imprimíveis. Não tenho certeza de como ele lidaria com a estranheza unicode, mas outros caracteres não imprimíveis deveriam ter sido mostrados.