Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 19/06/2017, à 12: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 smile

Donut

Dernière modification par DonutMan75 (Le 19/06/2017, à 13:05)

Hors ligne

#2 Le 19/06/2017, à 12: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, à 12: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, à 12: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, à 13: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, à 13:08)

Hors ligne

#5 Le 19/06/2017, à 13: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, à 15: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, à 16:14

erresse

Re : [RESOLU] Comportement étrange de diff

FrancisFDZ a écrit :

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...
smile


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 résolu, 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, à 19: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 ...  wink
Nez en moins, merci pour cette rectification !

Dernière modification par FrancisFDZ (Le 19/06/2017, à 19:35)


-- On peut avoir des raisons de se plaindre et n'avoir pas raison de se plaindre --
[Victor Hugo]

Hors ligne