Formater un résultat
Résolu
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 !
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
-
ContributeurSalut,
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
-
ModérateurChaque 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 '.. -
-
Contributeur@dna.factory
: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. -
-
Contributeur@dna.factory
$ 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
-
-
Contributeurhello
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