diff melaporkan baris yang sama dengan 2 file yang berbeda

13

Saya memiliki 2 file yang berisi daftar lagu. hdsongs.txt dan sdsongs.txt

Saya menulis skrip sederhana untuk mendaftar semua lagu dan output ke file teks, untuk kemudian menjalankan diff terhadap. Ini berfungsi dengan baik untuk sebagian besar, tetapi perintah diff aktual dalam skrip menunjukkan baris yang sama sebagai berbeda. Ini sebenarnya terjadi untuk beberapa baris, tetapi tidak semua.

Berikut adalah contoh lagu di kedua file:

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

Tidak ada karakter spesial tertinggal yang dapat saya lihat:

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

Ketika saya menjalankan diff, ini menunjukkan baris yang sama berada di setiap file; tapi bukankah garisnya sama?

$ diff hdsongs.txt sdsongs.txt | grep Apologize
> Timbaland/Apologize.mp3
< Timbaland/Apologize.mp3

Ini mirip dengan utas di sini: laporan diff dua file berbeda, meskipun mereka sama!

tapi ini untuk baris dalam file, bukan keseluruhan file, dan resolusi di sana sepertinya tidak cocok dalam kasus ini.

$ 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

Adakah yang tahu mengapa diff akan melaporkan baris yang sama dua kali seperti ini?

pengguna1718443
sumber
Mungkin mencoba hexdumpdua garis itu dan melihat apa yang berbeda?
user43791

Jawaban:

23

Dugaan saya adalah Anda belum mengurutkan file. Itu salah satu perilaku yang bisa Anda dapatkan pada input yang tidak disortir:

$ cat file1 
foo
bar
$ cat file2
bar
foo
$ $ diff file1 file2
1d0
< foo
2a2
> foo

Tapi, jika Anda menyortir:

$ diff <(sort file1) <(sort file2)
$ 

Tugas diffprogram adalah memberi tahu Anda apakah dua file itu identik dan, jika tidak, di mana mereka berbeda. Itu tidak dirancang untuk menemukan kesamaan antara garis yang berbeda. Jika baris X dari satu file tidak sama dengan baris X yang lain, maka file tidak sama. Tidak masalah jika mereka berisi informasi yang persis sama, jika informasi itu disusun dengan cara yang berbeda, file-file tersebut dilaporkan berbeda.

terdon
sumber
4

Karena Anda belum menyatakan bahwa file diurutkan, saya akan berasumsi bahwa mereka tidak. Ini adalah output yang diharapkan dari diff ketika sebuah baris muncul di kedua file, tetapi di lokasi yang berbeda. Ini akan menjadi jelas jika Anda melihat seluruh diffoutput, daripada menyalurkannya grep.

G-Man Mengatakan 'Reinstate Monica'
sumber
2

Saya akan menyarankan mencoba menggunakan sesuatu seperti program hexdiff untuk mendapatkan output biner / heksadesimal, karena mata manusia tidak selalu dapat membedakan antara karakter yang ditampilkan komputer, dan beberapa karakter mungkin tidak ditampilkan.

Jason Rush
sumber
2
cat -Aakan menunjukkan sebagian besar (semua?) kasus karakter non-cetak. Saya tidak yakin bagaimana ini bisa diatasi dengan keanehan unicode tetapi karakter non-cetak lainnya seharusnya sudah ditunjukkan.
terdon