diff relata a mesma linha que diferente em 2 arquivos

13

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?

user1718443
fonte
Talvez tente hexdumpessas duas linhas e veja o que difere?
user43791

Respostas:

23

Meu palpite é que você simplesmente não classificou os arquivos. Esse é um dos comportamentos que você pode obter em entradas não classificadas:

$ cat file1 
foo
bar
$ cat file2
bar
foo
$ $ diff file1 file2
1d0
< foo
2a2
> foo

Mas, se você classificar:

$ diff <(sort file1) <(sort file2)
$ 

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

terdon
fonte
4

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 a diffsaída, em vez de transmiti-la grep.

G-Man diz que 'restabelece Monica'
fonte
2

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.

Jason Rush
fonte
2
cat -Ateria 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.
terdon