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

mamiemando Messages postés 34169 Statut Modérateur 7 885
 
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
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
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
hello
$ var="3001-3009"; seq -s "," ${var%%-*} ${var##*-}
3001,3002,3003,3004,3005,3006,3007,3008,3009
0