Formater un résultat

Résolu/Fermé
dna.factory Messages postés 24957 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 26 avril 2024 - Modifié par dna.factory le 13/08/2015 à 16:18
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 - 14 août 2015 à 09:30
Bonjour,

J'ai une question toute bête.
j'ai le résultat d'une commande qui est sous la forme d'un nombre, pour l'instant, entre 10 et 999, mais techniquement entre 1 et 999999

je voudrais transformer mon résultat sous la forme XX.XX.XX (avec des zéros à gauche).
alors en soit, je suis pas bloqué... dans le pire des cas, je comptes le nombre de chiffres avec ${#variable}, je rajoute (6-longeur) zéros devant, et une fois que j'ai une longueur fixe, je awke ou sede les points sans trop de difficulté (quitte à faire 3 substrings).

Mais comme souvent, je suppose qu'il y a beaucoup plus 'propre' et simple (je pense à printf entre autre).

Est-ce que vous pouvez m'aider ? (jai failli oublier de mettre une question).
Ya des point bonus pour l'esthétique.

entrée :
125
10
4501

sortie
00.01.25
00.00.10
00.45.01




Stop failing the turing test !

2 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
13 août 2015 à 16:35
Salut,

En attendant dubcek pour une solution avec printf et/ou awk, voici la mienne avec sed ;-))

$ cat fich 
125
10
4501

$ sed ':z;s/^.\{1,5\}$/0&/;tz;s/..\B/&./g' fich
00.01.25
00.00.10
00.45.01

1
dna.factory Messages postés 24957 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 26 avril 2024 1 609
13 août 2015 à 16:52
Chaque fois que je vois sed, je pense à cette blague ou le mec en cours de math se leve en disant : "pardon, je pensais être en cours de math, pas en cours de grec..."

Y'a pas à dire, coté esthétique, ça se pose là...
Par contre, je vais mettre ça dans mon programme, et dans un an, je vais être là : 'merde, qu'est-ce que ça fait ce truc '..
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407 > dna.factory Messages postés 24957 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 26 avril 2024
13 août 2015 à 17:02
:z
On pose une étiquette

s/^.\{1,5\}$/0&/
Là on vérifie que la ligne comprend entre 1 et 5 caractère(s), et si c'est le cas on substitue la ligne par elle même (&) précédé d'un 0 (zéro)

tz
Si et seulement si une substitution a eu lieu précédemment, se brancher (commande t) à l'étiquette (z) et recommencer.

s/..\B/&./g
Quand on a bien 6 caractères, on substitue chaque 2 caractères par eux-mêmes suivis d'un point, sauf si on est en limite de caractère (\B) en fin de ligne quoi.
0
dna.factory Messages postés 24957 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 26 avril 2024 1 609
13 août 2015 à 16:56
ho... pour des points bonus...
En vrai, mon entrée était en xml :
<cle>125</cle>
j'avais déja fait un petit awk -F '<|>' {print $3}'
Juste pour le trip, tu peux me montrer ce que donnerait le sed qui vire les balises xml au passage ?
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407 > dna.factory Messages postés 24957 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 26 avril 2024
13 août 2015 à 18:20
$ cat fich 
<cle>125</cle>
<cle>10</cle>
<cle>4501</cle>

$ sed 's#</*[^>]*>##g;:z;s/^.\{1,5\}$/0&/;tz;s/..\B/&./g' fich
00.01.25
00.00.10
00.45.01
0
dna.factory Messages postés 24957 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 26 avril 2024 1 609
13 août 2015 à 17:04
nan, mais quand tu l'explique, ça a l'air simple... c'est ça le pire...
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
14 août 2015 à 09:30
hello
quelques variantes,
$ awk -F "[<>]" '{x=sprintf ("%06d", $3); print substr(x, 1, 2) "." substr (x, 3, 2) "." substr(x, 5)}' fichier
00.01.25
00.00.10
00.45.01
$ sed -r 's/[^0-9]//g; s/.*/printf "%06d" &/e; s/(^..)(..)/\1.\2./' fichier
00.01.25
00.00.10
00.45.01
$ awk -F "[<>]" '{printf "%06d\n", $3}' fichier | sed -r 's/(^..)(..)/\1.\2./'
00.01.25
00.00.10
00.45.01
1