diff zgłasza ten sam wiersz co inny w 2 plikach


14

Mam 2 pliki zawierające listę utworów. hdsongs.txt i sdsongs.txt

Napisałem prosty skrypt, aby wyświetlić listę wszystkich utworów i wyprowadzić je do plików tekstowych, a następnie uruchomić różnicę. W większości działa dobrze, ale rzeczywiste polecenie diff w skrypcie pokazuje tę samą linię, co różne. Dzieje się tak w przypadku wielu linii, ale nie wszystkich.

Oto przykład utworu w obu plikach:

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

Nie widzę żadnego końcowego znaku specjalnego:

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

Kiedy uruchamiam diff, pokazuje ten sam wiersz znajdujący się w każdym pliku; ale czy linie nie są takie same?

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

Jest to podobne do wątku tutaj: raporty różnic różnią się dwoma plikami, chociaż są takie same!

ale dotyczy to linii w pliku, a nie całego pliku, a rozdzielczość w tym przypadku wydaje się nie pasować.

$ 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

Czy ktoś wie, dlaczego diff miałby zgłaszać tę samą linię dwa razy w ten sposób?


1
Może spróbuj hexdumptych dwóch linii i zobaczyć, co się różni?
user43791,

Odpowiedzi:


24

Domyślam się, że po prostu nie posortowałeś plików. To jedno z zachowań, które można uzyskać przy nieposortowanych danych wejściowych:

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

Ale jeśli posortujesz:

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

Zadaniem diffprogramu jest sprawdzenie, czy dwa pliki są identyczne, a jeśli nie, gdzie się różnią. Nie jest przeznaczony do wyszukiwania podobieństw między różnymi liniami. Jeśli linia X jednego pliku nie jest taka sama jak linia X drugiego pliku, pliki nie są takie same. Nie ma znaczenia, czy zawierają dokładnie te same informacje, jeśli te informacje są zorganizowane w inny sposób, pliki są zgłaszane jako różne.


4

Ponieważ nie powiedziałeś, że pliki są posortowane, założę się, że nie są. Jest to oczekiwany wynik, diff gdy linia pojawi się w obu plikach, ale w różnych lokalizacjach. Byłoby to jasne, gdybyś spojrzał na całe diffwyjście, zamiast je przepuszczać grep.


2

Sugerowałbym próbę użycia czegoś takiego jak program hexdiff, aby uzyskać dane binarne / szesnastkowe, ponieważ ludzkie oko nie zawsze może odróżnić znaki wyświetlane przez komputer, a niektóre znaki mogą nie być wyświetlane.


2
cat -Apokazałby większość (wszystkich?) przypadków znaków niedrukowalnych. Nie jestem pewien, jak poradziłby sobie z dziwnością unicode, ale powinny zostać pokazane inne znaki niedrukowalne.
terdon
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.