Transformer une valeur numérique

bzhmickael35 Messages postés 4 Statut Membre -  
lEprofSonDkon Messages postés 227 Statut Membre -
Bonjour,

Je cherche à réaliser un petit script pour transformer une valeur obtenu avec l'aide d'un AWK. Je souhaite transformer :
3001-3009
en
3001,3002,3003,3004,3005,3006,3007,3008,3009
.

Merci d'avance pour toute l'aide apportée.

2 réponses

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Bonjour,

    Voici une manière de procéder :

    script.awk

    /[0-9]+-[0-9]+/ {
        n = split($0, array, "-")
        imin = int(array[1])
        imax = int(array[2])
        s = "";
        for (i = imin; i <= imax; i++) {
            if (i > imin) s = s ","
            s = s i;        
        }
        print s;
    }


    Ce qui donne à l'exécution :

    (mando@silk) (~) $ echo "3001-3009" | awk -f script.awk 
    3001,3002,3003,3004,3005,3006,3007,3008,3009


    Quelques explications :
    • La première ligne s'assure que la ligne qui entre est formée de deux entiers séparés d'un tiret (voir expressions régulières)
    • La ligne suivante sépare la ligne en question sur le caractère
      -
      et stocke les deux valeurs dans le tableau
      array
      .
    • On construit ensuite progressivement une chaine
      s
      en itérant sur les valeurs déduites de
      array
      .


    Bonne chance
    0
    1. lEprofSonDkon Messages postés 227 Statut Membre 13
       
      salut,

      il faut s'assurer que la données ne contient que des nombres, du début (
      ^
      ) à la fin (
      $
      ) :
      /^[0-9]+-[0-9]+$/
      .

      et on peut simplifier la boucle :
      for (i = imin; i <= imax; i++) s = s ? s "," i : i
      .
      0
  2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    $ var="3001-3009"; seq -s "," ${var%%-*} ${var##*-}
    3001,3002,3003,3004,3005,3006,3007,3008,3009
    0