raporty różnic dwa pliki różnią się, chociaż są takie same!

31

Mam dwa pliki, które wyglądają identycznie do mnie (w tym końcowe białe znaki i znaki nowej linii), ale diff wciąż mówi, że się różnią. Nawet kiedy to zrobiędiff -y porównanie obok siebie, linie wyglądają dokładnie tak samo. Dane wyjściowe z diff to całe 2 pliki.

Masz pojęcie, co to powoduje?

MinaHany
źródło
3
Spróbuj porównać znaki niedrukowalne. Najprostszym sposobem na ich obejrzenie jest sed -n l filename. Jeśli to nie pomoże, dodaj przykład danych i diffwyjdź tutaj.
pędzi
1
Achh tak, dziękuję, wiersze w pliku kończą się na $, a na drugim kończy się na \ r $
MinaHany
1
Szybką poprawką jest użycie dos2unix na obu plikach (lub tym, co do którego podejrzewasz, że pochodzi z komputera z systemem Windows).
chembrad
Jako uzupełnienie istniejących odpowiedzi: filepolecenie podpowie Ci o zawartości pliku, w tym np . ASCII text, with CRLF line terminatorsVs. ASCII text
Stéphane Gourichon,

Odpowiedzi:

29

Dziwne ... możesz spróbować cmp? Możesz także skorzystać z -bopcji „ ”.

strona podręcznika cmp - Porównaj dwa pliki bajt po bajcie.

Jest to jedna z fajnych cech Uniksa / Linuksa ... tak wiele narzędzi :)

Levon
źródło
2
Dziękuję za to! Mam: bajt 19, wiersz 1 to 15 ^ M 12 ^ J co to znaczy?
MinaHany
3
wygląda jak powrót karetki i podawanie linii zgodnie z tą tabelą
Levon
2
spróbowałem -b z diff i wydaje się, że to działa dla mnie. strona man mówi, że -bjest dla ignore changes in the amount of white space.
rahul.deshmukhpatil
17

Czy różnice mogą wynikać z zakończenia linii DOS vs. UNIX, czy coś podobnego?

Co jeśli ty hexdump? Może to pokazywać różnice w bardziej oczywisty sposób, np .:

hexdump -C file1 > file1.hex
hexdump -C file2 > file2.hex
diff file1.hex file2.hex
mrb
źródło
Cóż, dwa heksy są różne. za każdym razem, gdy w pliku jest 0d 0a, drugi ma po prostu 0a
MinaHany
3
W jednym masz zakończenia linii DOS (CRLF), a w drugim zakończenia linii UNIX (LF). Dlatego wyglądają inaczej niż diff, ale nie kiedy patrzysz na nie wizualnie. Spójrz na en.wikipedia.org/wiki/Newline#Conversion_utilities
mrb
Rozumiem! Wielkie dzięki. Sugestia Levona dotycząca użycia cmp pokazuje jednak różnicę wyraźniej :)
MinaHany,
17

Próbować:

diff file1 file2 | cat -t

-tOpcja spowoduje catpokazać wyraźnie żadnych znaków specjalnych - np. ^Mdla CR, ^Idla tab.

Ze strony podręcznika (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
źródło
4

Moje pierwsze przypuszczenie, które okazuje się potwierdzone, polega na tym, że pliki mają różne zakończenia linii. Może to być inna różnica w białych znakach, na przykład obecność białych znaków na końcu (ale zwykle nie występuje w wielu liniach) lub różne wcięcia (tabulatory a spacje). Użyj polecenia, które drukuje białe znaki i kontroluje znaki w widocznej formie, np

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

Możesz potwierdzić, że różnice dotyczą tylko zakończeń linii, najpierw je normalizując. Możesz mieć dos2unixnarzędzie; jeśli nie, jawnie usuń dodatkowy znak CR (^ M, \ r, \ 015):

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

lub, jeśli file1jest to ten z zakończeniami DOS

 tr -d '\r' <file1 | diff - file2
Gilles „SO- przestań być zły”
źródło