diff รายงานบรรทัดเดียวกันกับไฟล์ต่างกัน 2 ไฟล์


13

ฉันมี 2 ไฟล์ที่มีรายการเพลง hdsongs.txt และ sdsongs.txt

ฉันเขียนสคริปต์ง่าย ๆ เพื่อแสดงรายการเพลงทั้งหมดและส่งออกไปยังไฟล์ข้อความเพื่อให้ทำงานต่างกัน มันใช้งานได้ดีสำหรับส่วนใหญ่ แต่คำสั่ง diff จริงในสคริปต์แสดงบรรทัดเดียวกันว่าแตกต่างกัน นี่คือสิ่งที่เกิดขึ้นจริงสำหรับหลายบรรทัด แต่ไม่ใช่ทั้งหมด

นี่คือตัวอย่างของเพลงในไฟล์ทั้งสอง:

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

ไม่มีตัวอักษรพิเศษต่อท้ายที่ฉันเห็นได้:

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

เมื่อฉันรัน diff มันจะแสดงบรรทัดเดียวกันในไฟล์แต่ละไฟล์ แต่เส้นไม่เหมือนกันหรือ

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

สิ่งนี้คล้ายกับเธรดที่นี่: diff รายงานสองไฟล์ต่างกันแม้ว่าจะเหมือนกัน!

แต่สำหรับบรรทัดภายในไฟล์ไม่ใช่ทั้งไฟล์และความละเอียดที่ปรากฏนั้นไม่พอดีในกรณีนี้

$ 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

ไม่มีใครรู้ว่าทำไม diff จะรายงานบรรทัดเดียวกันสองครั้งเช่นนี้?


อาจลองhexdumpสองบรรทัดนั้นแล้วดูว่าต่างกันอย่างไร
user43791

คำตอบ:


23

ฉันเดาว่าคุณไม่ได้เรียงไฟล์ นั่นเป็นพฤติกรรมอย่างหนึ่งที่คุณจะได้รับจากข้อมูลที่ไม่เรียงลำดับ:

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

แต่ถ้าคุณจัดเรียง:

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

diffงานของโปรแกรมคือการบอกให้คุณทราบว่าทั้งสองไฟล์เหมือนกันและถ้าไม่ได้ที่พวกเขาแตกต่างกัน ไม่ได้ออกแบบมาเพื่อค้นหาความคล้ายคลึงกันระหว่างบรรทัดที่ต่างกัน หาก line X ของไฟล์หนึ่งไม่เหมือนกันกับ line X ของไฟล์อื่นแสดงว่าไฟล์นั้นไม่เหมือนกัน ไม่สำคัญว่าพวกเขาจะมีข้อมูลเหมือนกันทุกประการหรือไม่หากข้อมูลนั้นถูกจัดเรียงในรูปแบบที่แตกต่างกันไฟล์จะถูกรายงานต่างกัน


4

เนื่องจากคุณไม่ได้ระบุว่าไฟล์ถูกเรียงลำดับฉันจะถือว่าไฟล์เหล่านั้นไม่ใช่ นี่คือผลลัพธ์ที่คาดหวังจากdiff เมื่อมีบรรทัดปรากฏในไฟล์ทั้งสอง แต่ในตำแหน่งอื่น นี้จะมีความชัดเจนถ้าคุณมองไปที่ทั้งการส่งออกมากกว่าท่อมันผ่านdiffgrep


2

ฉันขอแนะนำให้ลองใช้โปรแกรม hexdiff เพื่อรับเอาต์พุตไบนารี / ฐานสิบหกเนื่องจากตามนุษย์ไม่สามารถบอกความแตกต่างระหว่างตัวละครที่คอมพิวเตอร์แสดงและตัวละครบางตัวอาจไม่สามารถแสดงผลได้


2
cat -Aจะแสดงกรณีที่ไม่ได้พิมพ์อักขระส่วนใหญ่ (ทั้งหมดหรือไม่) ฉันไม่แน่ใจว่ามันจะรับมือกับความแปลกประหลาดของยูนิโค้ดได้อย่างไร แต่ควรแสดงตัวอักษรที่ไม่พิมพ์อื่น ๆ
terdon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.