beda laporan dua file berbeda, walaupun sama!

31

Saya memiliki dua file yang terlihat identik dengan saya (termasuk spasi spasi putih dan baris baru) tetapi diff masih mengatakan mereka berbeda. Bahkan ketika saya melakukan diff -yperbandingan berdampingan, garis-garisnya terlihat sama persis. Output dari diff adalah keseluruhan 2 file.

Adakah yang tahu penyebabnya?

MinaHany
sumber
3
Cobalah membandingkan karakter yang tidak patut dicetak. Cara termudah untuk menonton mereka adalah sed -n l filename. Jika tidak akan membantu, tambahkan contoh data dan diffhasilkan di sini.
buru
1
Ahh ya terima kasih, baris dalam file diakhiri dengan $ dan yang lain berakhir dengan \ r $
MinaHany
1
Perbaikan cepat adalah dengan menggunakan dos2unix pada kedua file (atau yang Anda curigai dari mesin Windows).
chembrad
Sebagai pelengkap jawaban ada: fileperintah akan petunjuk Anda tentang isi file, termasuk hal-hal seperti ASCII text, with CRLF line terminatorsvs ASCII text.
Stéphane Gourichon

Jawaban:

29

Aneh .. bisakah kamu mencoba cmp? Anda mungkin ingin menggunakan opsi ' -b' juga.

cmp man page - Membandingkan dua file byte demi byte.

Ini adalah salah satu hal yang menyenangkan tentang Unix / Linux .. begitu banyak alat :)

Levon
sumber
2
Terima kasih untuk itu! Saya mendapat: byte 19, baris 1 adalah 15 ^ M 12 ^ J apa artinya?
MinaHany
3
sepertinya carriage return dan linefeed menurut tabel ini
Levon
2
mencoba -b dengan diff dan tampaknya berfungsi untuk saya. Halaman manual mengatakan -buntuk ignore changes in the amount of white space.
rahul.deshmukhpatil
17

Mungkinkah perbedaan disebabkan oleh akhir baris DOS vs UNIX, atau sesuatu yang serupa?

Bagaimana jika Anda hexdumpmereka? Ini mungkin menunjukkan perbedaan lebih jelas, misalnya:

hexdump -C file1 > file1.hex
hexdump -C file2 > file2.hex
diff file1.hex file2.hex
mrb
sumber
Nah, kedua heks tersebut berbeda. setiap kali ada 0d 0a dalam file yang lain hanya 0a
MinaHany
3
Dalam satu, Anda memiliki ujung garis DOS (CRLF) dan yang lain, ujung garis UNIX (LF). Itu sebabnya mereka terlihat berbeda tetapi tidak ketika Anda melihatnya secara visual. Lihatlah en.wikipedia.org/wiki/Newline#Conversion_utilities
mrb
Oke! Terima kasih banyak. Saran Levon untuk menggunakan cmp menunjukkan perbedaan lebih jelas :)
MinaHany
17

Mencoba:

diff file1 file2 | cat -t

The -tpilihan akan menyebabkan catmenunjukkan karakter khusus jelas - misalnya. ^Muntuk CR, ^Iuntuk tab.

Dari halaman 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
sumber
4

Tebakan pertama saya, yang ternyata dikonfirmasi, adalah bahwa file menggunakan akhiran baris yang berbeda. Mungkin ada beberapa perbedaan lain di spasi putih, seperti keberadaan spasi tambahan (tetapi Anda biasanya tidak akan mendapatkannya di banyak baris) atau lekukan yang berbeda (tab vs spasi). Gunakan perintah yang mencetak spasi putih dan mengontrol karakter dalam bentuk yang terlihat, seperti

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

Anda dapat mengonfirmasi bahwa perbedaan hanya berkaitan dengan akhiran garis dengan menormalkannya terlebih dahulu. Anda mungkin memiliki dos2unixutilitas; jika tidak, hapus karakter CR (^ M, \ r, \ 015) tambahan secara eksplisit:

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

atau, jika file1ada yang dengan ujung DOS

 tr -d '\r' <file1 | diff - file2
Gilles 'SANGAT berhenti menjadi jahat'
sumber