#1 Le 19/06/2017, à 11:03
- DonutMan75
[RESOLU] Comportement étrange de diff
Bonjour à tous,
j'ai un comportement étrange de diff.
J'essaie de comparer deux fichiers qui semblent identiques à l'oeil nu mais diff me sort tout de même des différences.
Ce sont des fichiers ASCII de plusieurs centaines de lignes mais ça marche aussi si je les tronque aux 3 dernières valeurs.
$ cat end1.txt
59433 0.00000 172.19 51.41 6807.047
59434 0.00000 309.71 -47.43 6826.045
59435 0.00000 97.44 34.69 6807.047
$ cat end2.txt
59433 0.00000 172.19 51.41 6807.047
59434 0.00000 309.71 -47.43 6826.045
59435 0.00000 97.44 34.69 6807.047
$ diff end1.txt end2.txt
1,3c1,3
< 59433 0.00000 172.19 51.41 6807.047
< 59434 0.00000 309.71 -47.43 6826.045
< 59435 0.00000 97.44 34.69 6807.047
---
> 59433 0.00000 172.19 51.41 6807.047
> 59434 0.00000 309.71 -47.43 6826.045
> 59435 0.00000 97.44 34.69 6807.047
Le truc à savoir est que le deuxième fichier a été généré sous Ubuntu mais pas le premier (on me l'a communiqué par mail)..
Serait-il possible qu'un Windows ait introduit des caractères d'échappement non visibles à l'oeil nu ? C'est ma meilleure hypothèse pour le moment....
J'ai un peu farfouillé et en faisant un od sur les fichiers tronqués à 3 lignes j'obtiens
$ od end1.txt
0000000 034465 031464 020063 027060 030060 030060 020060 033461
0000020 027062 034461 032440 027061 030464 033040 030070 027067
0000040 032060 006467 032412 032071 032063 030040 030056 030060
0000060 030060 031440 034460 033456 020061 032055 027067 031464
0000100 033040 031070 027066 032060 006465 032412 032071 032463
0000120 030040 030056 030060 030060 034440 027067 032064 031440
0000140 027064 034466 033040 030070 027067 032060 006467 000012
0000157$ od end2.txt
0000000 034465 031464 020063 027060 030060 030060 020060 033461
0000020 027062 034461 032440 027061 030464 033040 030070 027067
0000040 032060 005067 034465 031464 020064 027060 030060 030060
0000060 020060 030063 027071 030467 026440 033464 032056 020063
0000100 034066 033062 030056 032464 032412 032071 032463 030040
0000120 030056 030060 030060 034440 027067 032064 031440 027064
0000140 034466 033040 030070 027067 032060 005067
0000154
Du coup à ce stade je cherche :
- à savoir comment afficher un fichier dans un terminal en affichant tous les caractères d'échappement
- à piloter diff pour ne pas prendre en compte ces différences de fichiers (ou à tout le moins, de modifier le fichier windows pour supprimer ces caractères)
Enfin, ça c'est en supposant que mon interprétation est correcte...
Qu'en pensez-vous ?
Merci d'avance
Donut
Dernière modification par DonutMan75 (Le 19/06/2017, à 12:05)
Hors ligne
#2 Le 19/06/2017, à 11:28
- FrancisFDZ
Re : [RESOLU] Comportement étrange de diff
Personnellement, je préfère comparer des fichiers en hexa (xd ou od -x, de mémoire) plutôt qu'en octal, mais ce n'est qu'une question d'habitude. Cependant, sans avoir vérifié, je pense que l'hypothèse de caractères d'échappement parasites est parfaitement vraisemblable, par exemple, la fin de ligne est marquée "CR + LF" sous Window$ (=Retour Chariot + Fin de Ligne) et seulement "CR" sous Unix (et linux par conséquent)
NB : je remarque que dans les fichiers en octal, les caractères qui suivent la première différence sont aussi différents; cela pouvant être dû à l'utilisation de od plutôt que xd (sans certitude)
Dernière modification par FrancisFDZ (Le 19/06/2017, à 11:34)
-- On peut avoir des raisons de se plaindre et n'avoir pas raison de se plaindre --
[Victor Hugo]
Hors ligne
#3 Le 19/06/2017, à 11:33
- pingouinux
Re : [RESOLU] Comportement étrange de diff
Bonjour,
Pour en avoir le cœur net
file end[12].txt
Pour faire la conversion, voir dos2unix et unix2dos, mais cela risque aussi de changer les lettres accentuées.
Hors ligne
#4 Le 19/06/2017, à 12:04
- DonutMan75
Re : [RESOLU] Comportement étrange de diff
Bonjour à tous,
merci pour ces remarques !
J'ignorais que file pouvait donner des indications sur la façon de terminer des lignes !
$ file end[12].txt
end1.txt: ASCII text, with CRLF line terminators
end2.txt: ASCII text
En farfouillant un peu dans les options de od j'obtiens un affichage beaucoup plus parlant :
$ od -t c end1.txt
0000000 5 9 4 3 3 0 . 0 0 0 0 0 1 7
0000020 2 . 1 9 5 1 . 4 1 6 8 0 7 .
0000040 0 4 7 \r \n 5 9 4 3 4 0 . 0 0 0
0000060 0 0 3 0 9 . 7 1 - 4 7 . 4 3
0000100 6 8 2 6 . 0 4 5 \r \n 5 9 4 3 5
0000120 0 . 0 0 0 0 0 9 7 . 4 4 3
0000140 4 . 6 9 6 8 0 7 . 0 4 7 \r \n
0000157
$ od -t c end2.txt
0000000 5 9 4 3 3 0 . 0 0 0 0 0 1 7
0000020 2 . 1 9 5 1 . 4 1 6 8 0 7 .
0000040 0 4 7 \n 5 9 4 3 4 0 . 0 0 0 0
0000060 0 3 0 9 . 7 1 - 4 7 . 4 3
0000100 6 8 2 6 . 0 4 5 \n 5 9 4 3 5 0
0000120 . 0 0 0 0 0 9 7 . 4 4 3 4 .
0000140 6 9 6 8 0 7 . 0 4 7 \n
A part od, je n'ai pas trouvé d'autres commandes pour afficher les caractères d'échappement.
Quoiqu'il en soit, voici deux solutions pour supprimer ces \r intempestifs, je ne pense pas qu'il existe de méthodes plus élégantes ?
$ sed -ri 's/\r//g' end1.txt
$ diff end1.txt end2.txt
$
$ tr -d '\r' < end1.txt > end1.txt
$ diff end1.txt end2.txt
$
EDIT : le tr -d '\r' < toto > toto ne fonctionne pas (j'obtiens un fichier vide), il faut faire un intermédiaire du style
$ tr -d '\r' < end1.txt > end1m.txt
$ diff end1m.txt end2.txt
$
Merci encore pour vos retours !
Donut
Dernière modification par DonutMan75 (Le 19/06/2017, à 12:08)
Hors ligne
#5 Le 19/06/2017, à 12:29
- pingouinux
Re : [RESOLU] Comportement étrange de diff
La commande hd donne aussi un résultat très lisible en hexadécimal :
$ hd end2.txt
00000000 35 39 34 33 33 20 30 2e 30 30 30 30 30 20 31 37 |59433 0.00000 17|
00000010 32 2e 31 39 20 35 31 2e 34 31 20 36 38 30 37 2e |2.19 51.41 6807.|
00000020 30 34 37 0a 35 39 34 33 34 20 30 2e 30 30 30 30 |047.59434 0.0000|
00000030 30 20 33 30 39 2e 37 31 20 2d 34 37 2e 34 33 20 |0 309.71 -47.43 |
00000040 36 38 32 36 2e 30 34 35 0a 35 39 34 33 35 20 30 |6826.045.59435 0|
00000050 2e 30 30 30 30 30 20 39 37 2e 34 34 20 33 34 2e |.00000 97.44 34.|
00000060 36 39 20 36 38 30 37 2e 30 34 37 0a |69 6807.047.|
0000006c
Hors ligne
#6 Le 19/06/2017, à 14:16
- FrancisFDZ
Re : [RESOLU] Comportement étrange de diff
Merci de la correction pingouinux, ce serait bien hd et pas xd (quoi que ...)
-- On peut avoir des raisons de se plaindre et n'avoir pas raison de se plaindre --
[Victor Hugo]
Hors ligne
#7 Le 19/06/2017, à 15:14
- erresse
Re : [RESOLU] Comportement étrange de diff
la fin de ligne est marquée "CR + LF" sous Window$ (=Retour Chariot + Fin de Ligne) et seulement "CR" sous Unix (et linux par conséquent)
Hé non, perdu ! Sous Unix et Linux, le caractère de fin de ligne c'est l'autre, "line feed" = 0x0A...
Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois le problème solutionné, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.
Hors ligne
#8 Le 19/06/2017, à 18:33
- FrancisFDZ
Re : [RESOLU] Comportement étrange de diff
Ok erresse, Al Zheimer a encore frappé ? 2 fois sur 2 (xd => hd ; CR=>LF), va falloir admettre : ma mémoire (crânienne) semble avoir des faiblesses ...
Nez en moins, merci pour cette rectification !
Dernière modification par FrancisFDZ (Le 19/06/2017, à 18:35)
-- On peut avoir des raisons de se plaindre et n'avoir pas raison de se plaindre --
[Victor Hugo]
Hors ligne