diff segnala che due file differiscono, sebbene siano uguali!


31

Ho due file che mi sembrano identici (compresi gli spazi bianchi finali e le nuove righe) ma diff dice ancora che differiscono. Anche quando faccio un diff -yconfronto fianco a fianco le linee sembrano esattamente uguali. L'output di diff è l'intero 2 file.

Qualche idea su cosa lo stia causando?


3
Prova a confrontare i caratteri non stampabili. Il modo più semplice per guardarli è sed -n l filename. Se non aiuta, aggiungi un esempio di dati e l' diffoutput qui.
corsa il

1
Ah sì, grazie, le righe in un file terminano con $ e nell'altra terminano con \ r $
MinaHany

1
Una soluzione rapida è usare dos2unix su entrambi i file (o su quello che sospetti provenga da un computer Windows).
Chembrad,

Come complemento alle risposte già esistenti: il filecomando accennare circa il contenuto del file, comprese le cose come ASCII text, with CRLF line terminatorsvs ASCII text.
Stéphane Gourichon,

Risposte:


29

Strano .. ci puoi provare cmp? Potresti voler usare anche l' -bopzione ' '.

Pagina man di cmp - Confronta due file byte per byte.

Questa è una delle cose belle di Unix / Linux .. tanti strumenti :)


2
Grazie per quello! Ho ottenuto: byte 19, la linea 1 è 15 ^ M 12 ^ J cosa significa?
MinaHany,

3
sembra ritorno a capo e avanzamento riga secondo questa tabella
Levon,

2
provato -b con il diff e sembra funzionare per me. la pagina man dice -bè per ignore changes in the amount of white space.
rahul.deshmukhpatil,

17

Le differenze potrebbero essere causate da terminazioni di riga DOS vs UNIX o qualcosa di simile?

E se tu hexdumpli? Ciò potrebbe mostrare differenze più ovviamente, ad esempio:

hexdump -C file1 > file1.hex
hexdump -C file2 > file2.hex
diff file1.hex file2.hex

Bene, i due esagoni sono diversi. ogni volta che c'è un 0d 0a in un file l'altro ha solo 0a
MinaHany

3
In uno, hai terminazioni di riga DOS (CRLF) e nell'altro, terminazioni di riga UNIX (LF). Ecco perché sembrano diversi da diff ma non quando li guardi visivamente. Guarda en.wikipedia.org/wiki/Newline#Conversion_utilities
mrb

Fatto! Molte grazie. Il suggerimento di Levon di usare cmp mostra la differenza più chiaramente però :)
MinaHany

17

Provare:

diff file1 file2 | cat -t

L' -topzione farà catapparire chiaramente tutti i caratteri speciali, ad es. ^Mper CR, ^Iper tab.

Dalla pagina man (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.

4

La mia prima ipotesi, che risulta essere confermata, è che i file usano terminazioni di riga diverse. Potrebbe esserci qualche altra differenza negli spazi bianchi, come la presenza di spazi bianchi finali (ma in genere non lo capiresti su molte righe) o rientri diversi (tabulazioni vs spazi). Utilizzare un comando che stampa spazi bianchi e controlla i caratteri in una forma visibile, ad esempio

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

Puoi confermare che le differenze hanno a che fare solo con i finali di linea normalizzandoli prima. Potresti avere dos2unixun'utilità; in caso contrario, rimuovere esplicitamente il carattere aggiuntivo CR (^ M, \ r, \ 015):

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

oppure, se file1è quello con terminazioni DOS

 tr -d '\r' <file1 | diff - file2
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.