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 !

2 réponses

  1. Contributeur
    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. Modérateur
      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 '..
    2. Modérateur
      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 ?
    3. 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.
    4. Modérateur
      nan, mais quand tu l'explique, ça a l'air simple... c'est ça le pire...
    5. 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
  2. Contributeur
    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