Formater un résultat

Résolu
dna.factory Messages postés 19915 Date d'inscription   Statut Modérateur Dernière intervention   -  
dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   -
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. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    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
    1. dna.factory Messages postés 19915 Date d'inscription   Statut Modérateur Dernière intervention   1 621
       
      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
      1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501 > dna.factory Messages postés 19915 Date d'inscription   Statut Modérateur Dernière intervention  
         
        :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
    2. dna.factory Messages postés 19915 Date d'inscription   Statut Modérateur Dernière intervention   1 621
       
      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
      1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501 > dna.factory Messages postés 19915 Date d'inscription   Statut Modérateur Dernière intervention  
         
        $ 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
    3. dna.factory Messages postés 19915 Date d'inscription   Statut Modérateur Dernière intervention   1 621
       
      nan, mais quand tu l'explique, ça a l'air simple... c'est ça le pire...
      0
  2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    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