diff báo cáo cùng một dòng như khác nhau trong 2 tập tin


13

Tôi có 2 tập tin chứa một danh sách các bài hát. hdsongs.txt và sdsongs.txt

Tôi đã viết một tập lệnh đơn giản để liệt kê tất cả các bài hát và xuất ra các tệp văn bản, để sau đó chạy khác. Nó hoạt động tốt đối với hầu hết các phần, nhưng lệnh diff thực tế trong tập lệnh đang hiển thị cùng một dòng là khác nhau. Điều này thực sự xảy ra cho nhiều dòng, nhưng không phải tất cả.

Dưới đây là ví dụ về một bài hát trong cả hai tệp:

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

Không có ký tự đặc biệt nào mà tôi có thể thấy:

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

Khi tôi chạy diff, nó hiển thị cùng một dòng trong mỗi tệp; Nhưng không phải các dòng giống nhau?

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

Điều này tương tự như luồng ở đây: diff báo cáo hai tệp khác nhau, mặc dù chúng giống nhau!

nhưng điều này là cho các dòng trong tệp, không phải toàn bộ tệp và độ phân giải dường như không phù hợp trong trường hợp này.

$ 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

Có ai biết tại sao diff sẽ báo cáo cùng một dòng hai lần như thế này không?


Có thể thử hexdumphai dòng đó và xem những gì khác nhau?
user43791

Câu trả lời:


23

Tôi đoán là bạn chỉ đơn giản là không sắp xếp các tập tin. Đó là một trong những hành vi bạn có thể nhận được đối với đầu vào chưa được sắp xếp:

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

Nhưng, nếu bạn sắp xếp:

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

Công diffviệc của chương trình là cho bạn biết liệu hai tệp có giống nhau hay không, nếu không, chúng khác nhau ở đâu. Nó không được thiết kế để tìm sự tương đồng giữa các dòng khác nhau. Nếu dòng X của một tệp không giống với dòng X của tệp kia, thì các tệp không giống nhau. Không có vấn đề gì nếu chúng chứa chính xác cùng một thông tin, nếu thông tin đó được tổ chức theo một cách khác, các tệp được báo cáo là khác nhau.


4

Vì bạn không nói rằng các tệp được sắp xếp, tôi sẽ cho rằng chúng không phải. Đây là đầu ra dự kiến ​​từ diff khi một dòng xuất hiện trong cả hai tệp, nhưng ở các vị trí khác nhau. Điều này sẽ rõ ràng nếu bạn nhìn vào toàn bộ diffđầu ra, thay vì dẫn nó quagrep .


2

Tôi khuyên bạn nên thử sử dụng một cái gì đó như chương trình hexdiff để có đầu ra nhị phân / thập lục phân, vì mắt người không thể luôn nói sự khác biệt giữa các ký tự mà máy tính hiển thị và một số ký tự có thể không được hiển thị.


2
cat -Asẽ hiển thị hầu hết (tất cả?) các ký tự không in. Tôi không chắc làm thế nào nó có thể đối phó với sự lạ lùng unicode nhưng các ký tự không in khác nên được hiển thị.
terdon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.