diff relata a mesma linha como diferente em 2 arquivos

12

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 enviá-las para arquivos de texto, para depois executar uma comparação. Ele funciona bem na maior parte, mas o comando diff real no script está mostrando a mesma linha como sendo diferente. Isso está realmente acontecendo para várias linhas, mas não todas.

Aqui está um exemplo de uma música em ambos os arquivos:

$ grep Apologize \*songs\*
hdsongs.txt:Timbaland/Apologize.mp3
sdsongs.txt:Timbaland/Apologize.mp3

Não há nenhum caractere especial à direita que eu possa ver:

$ cat -A hdsongs.txt sdsongs.txt | grep Apologize
Timbaland/Apologize.mp3$
Timbaland/Apologize.mp3$

Quando executo o 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 segmento aqui: diff relata que dois arquivos são diferentes, embora sejam os mesmo!

mas isso é para linhas dentro do arquivo, não para todo o arquivo, e a resolução parece não 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?

    
por user1718443 15.12.2015 / 00:24

3 respostas

21

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

$ 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 trabalho do programa diff é dizer 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 forem organizadas de maneira diferente, os arquivos serão relatados como diferentes.

    
por 15.12.2015 / 00:34
3

Como você não afirmou que os arquivos estão classificados, Eu suponho que eles não são. Esta é a saída esperada de diff quando uma linha aparece em ambos os arquivos, mas em locais diferentes. Isso ficaria claro se você olhasse toda a saída diff , em vez de canalizá-lo através de grep .

    
por 15.12.2015 / 00:36
2

Eu sugeriria tentar usar algo como o programa hexadiff para obter uma saída binária / hexadecimal, já que 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.

    
por 15.12.2015 / 00:33

Tags