diff rapporte la même ligne que différente dans 2 fichiers

13

J'ai 2 fichiers contenant une liste de chansons. hdsongs.txt et sdsongs.txt

J'ai écrit un script simple pour répertorier toutes les chansons et les exporter vers des fichiers texte, puis exécuter un diff. Cela fonctionne très bien pour la plupart, mais la commande diff réelle dans le script affiche la même ligne comme étant différente. Cela se produit en fait pour plusieurs lignes, mais pas pour toutes.

Voici un exemple de morceau dans les deux fichiers:

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

Je ne vois aucun caractère spécial de fin:

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

Lorsque je lance diff, cela montre la même ligne dans chaque fichier; mais les lignes ne sont-elles pas les mêmes?

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

Ceci est similaire au fil ici: diff signale que deux fichiers diffèrent, bien qu'ils soient identiques!

mais c'est pour les lignes dans le fichier, pas le fichier entier, et la résolution ne semble pas correspondre dans ce cas.

$ 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

Est-ce que quelqu'un sait pourquoi diff signalerait la même ligne deux fois comme ça?

user1718443
la source
Essayez peut-être hexdumpces deux lignes et voyez ce qui diffère?
user43791

Réponses:

23

Je suppose que vous n'avez tout simplement pas trié les fichiers. C'est l'un des comportements que vous pouvez obtenir sur une entrée non triée:

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

Mais si vous triez:

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

Le difftravail du programme est de vous dire si deux fichiers sont identiques et, sinon, où ils diffèrent. Il n'est pas conçu pour trouver des similitudes entre différentes lignes. Si la ligne X d'un fichier n'est pas la même que la ligne X de l'autre, les fichiers ne sont pas identiques. Peu importe s'ils contiennent exactement les mêmes informations, si ces informations sont organisées de manière différente, les fichiers sont signalés comme différents.

terdon
la source
4

Comme vous n'avez pas déclaré que les fichiers sont triés, je suppose qu'ils ne le sont pas. Il s'agit de la sortie attendue à partir du diff moment où une ligne apparaît dans les deux fichiers, mais à des emplacements différents. Ce serait clair si vous regardiez la diffsortie entière , plutôt que de la passer à travers grep.

G-Man dit «Réintègre Monica»
la source
2

Je suggère d'essayer d'utiliser quelque chose comme le programme hexdiff pour obtenir une sortie binaire / hexadécimale, car l'œil humain ne peut pas toujours faire la différence entre les caractères affichés par un ordinateur et certains caractères peuvent ne pas être affichés.

Jason Rush
la source
2
cat -Aaurait montré la plupart (tous?) des cas de caractères non imprimables. Je ne sais pas comment cela aurait pu faire face à l'étrangeté unicode, mais d'autres caractères non imprimables auraient dû être affichés.
terdon