O diff apresenta dois arquivos diferentes, embora sejam iguais!

31

Eu tenho dois arquivos que parecem idênticos para mim (incluindo espaços em branco à direita e novas linhas), mas o diff ainda diz que são diferentes. Mesmo quando faço uma diff -ycomparação lado a lado, as linhas são exatamente iguais. A saída do diff são os 2 arquivos inteiros.

Alguma idéia do que está causando isso?

MinaHany
fonte
3
Tente comparar caracteres não imprimíveis. A maneira mais simples de vê-los é sed -n l filename. Se isso não ajudar, adicione um exemplo de dados e faça a diffsaída aqui.
apressar
1
Ahh sim obrigado, as linhas em um arquivo está terminando com $ e no outro terminando com \ r $
MinaHany
1
Uma solução rápida é usar o dos2unix nos arquivos (ou no que você suspeita ser de uma máquina Windows).
chembrad
Como complemento às respostas existentes: o filecomando irá sugerir-lhe sobre o conteúdo do arquivo, incluindo coisas como ASCII text, with CRLF line terminatorsvs ASCII text.
Stéphane Gourichon

Respostas:

29

Estranho .. você pode tentar cmp? Você também pode usar a -bopção ' '.

página de manual do cmp - Compare dois arquivos byte por byte.

Essa é uma das coisas legais do Unix / Linux .. tantas ferramentas :)

Levon
fonte
2
Obrigado por isso! Eu obtive: byte 19, a linha 1 é 15 ^ M 12 ^ J o que isso significa?
MinaHany 17/08
3
olhares como retorno de carro e avanço de linha de acordo com esta tabela
Levon
2
tentei -b com o diff e parece estar funcionando para mim. A página de manual diz que -bé para ignore changes in the amount of white space.
Rahul.deshmukhpatil
17

As diferenças podem ser causadas por terminações de linha DOS vs. UNIX ou algo semelhante?

E se você hexdumpeles? Isso pode mostrar diferenças mais obviamente, por exemplo:

hexdump -C file1 > file1.hex
hexdump -C file2 > file2.hex
diff file1.hex file2.hex
mrb
fonte
Bem, os dois hexágonos são diferentes. cada vez que há um 0a 0d em um arquivo o outro só tem 0a
MinaHany
3
Em um, você tem finais de linha do DOS (CRLF) e no outro, finais de linha do UNIX (LF). É por isso que eles parecem diferentes das diferenças, mas não quando você os olha visualmente. Veja en.wikipedia.org/wiki/Newline#Conversion_utilities
mrb
Consegui! Muito obrigado. A sugestão de Levon de usar mostra CMP a diferença mais claramente embora :)
MinaHany
17

Experimentar:

diff file1 file2 | cat -t

A -topção fará com catque os caracteres especiais sejam mostrados claramente - por exemplo, ^Mpara CR, ^Ipara tab.

Na página do manual (OS X):

 -t      Display non-printing characters (see the -v option), and display tab characters as `^I'.

 -v      Display non-printing characters so they are visible.
         Control characters print as `^X' for control-X; the delete character
         (octal 0177) prints as `^?'.  Non-ASCII characters
         (with the high bit set) are printed as `M-' (for meta) followed by the
         character for the low 7 bits.
JosephH
fonte
4

Meu primeiro palpite, que acaba de ser confirmado, é que os arquivos usam diferentes finais de linha. Pode haver alguma outra diferença no espaço em branco, como a presença de espaço em branco à direita (mas você normalmente não conseguiria isso em muitas linhas) ou indentação diferente (guias versus espaços). Use um comando que imprima espaços em branco e controle caracteres de forma visível, como

diff <(cat -A file1) <(cat -A file2)
diff <(sed -n l file1) <(sed -n l file2)

Você pode confirmar que as diferenças só têm a ver com terminações de linha normalizando-as primeiro. Você pode ter um dos2unixutilitário; caso contrário, remova o caractere extra de CR (^ M, \ r, \ 015) explicitamente:

diff <(tr -d '\r' <file1) <(tr -d '\r' <file2)

ou, se file1é aquele com terminações do DOS

 tr -d '\r' <file1 | diff - file2
Gilles 'SO- parar de ser mau'
fonte