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?
hexdump
ces deux lignes et voyez ce qui diffère?Réponses:
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:
Mais si vous triez:
Le
diff
travail 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.la source
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 ladiff
sortie entière , plutôt que de la passer à traversgrep
.la source
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.
la source
cat -A
aurait 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.