#1 Le 08/08/2008, à 09:17
- yag00
[Resolu]Shell : recupération de données dans une chaine
bonjour
dans un shell, j'ai une commande qui me renvoie une chaine de caractère sur deux ligne formaté comme ceci :
Number of field: 3
field: field1,field2,field3
je cherche à récupérer le nombre de champ ainsi que la liste
nbfield=$($commande | awk '/Number of field:/ { print $NF }')
for (( i=0; i<$nbfield; i++ ))
do
echo $i
field[$i]= ??????
echo $field $field[$i]
done
je récupère bien le nombre de champs
j'ai bricolé avec awk pour récupérer les champ dans un tableau sans succès ??
comment faire?
j'espere que vous pourrez m'aider avec ce code, merci
Edit : j'ai essayé de coder ceci en perl mais ne connaissant pas bien le perl je ne suis pas arriver à une solution correcte : si vous avez une solution en perl je suis preneur aussi, merci
Dernière modification par yag00 (Le 08/08/2008, à 14:10)
Hors ligne
#2 Le 08/08/2008, à 10:03
- Totor
Re : [Resolu]Shell : recupération de données dans une chaine
Voilà une solution (sans avoir testé) :
resCmd=$(${commande})
nbfield=$(echo ${resCmd} | awk '/Number of field:/ { print $NF }')
fields=$(echo ${resCmd} | |sed '/^field:/!d;s/field://')
for (( i=0; i<$nbfield; i++ ))
do
echo $i
field[$i]=$(echo ${fields}|awk -F"," -v numChp=$i '{print $numChp}')
echo $field[$i]
done
EDIT :
où ceci :
resCmd=$(${commande})
nbfield=$(echo ${resCmd} | awk '/Number of field:/ { print $NF }')
fields=$(echo ${resCmd} | |sed '/^field:/!d;s/field://')
for (( i=0; i<$nbfield; i++ ))
do
echo $i
field[$i]=$(echo ${fields}||cut -f${i} -d",")
echo $field[$i]
done
Dernière modification par Totor (Le 08/08/2008, à 10:06)
-- Lucid Lynx --
Hors ligne
#3 Le 08/08/2008, à 13:31
- yag00
Re : [Resolu]Shell : recupération de données dans une chaine
merci
pour la commande avec sed ça marche nickel
je récupère donc dans fields la chaine suivante : field1,field2,field3
par contre la suite ne fonctionne pas : découper et mettre chaque champ dans un tableau
Hors ligne
#4 Le 08/08/2008, à 13:40
- Totor
Re : [Resolu]Shell : recupération de données dans une chaine
fields=$(echo ${resCmd} | |sed '/^field:/!d;s/field://')
à remplacer par
fields=$(echo ${resCmd} | sed '/^field:/!d;s/field://')
et
field[$i]=$(echo ${fields}||cut -f${i} -d",")
par
field[$i]=$(echo ${fields}|cut -f${i} -d",")
(erreur de syntaxe : double pipe dans les 2 cas)
après... peux-tu poster tes sorties d'erreur/standard ?
ça m'orienterait dans mes recherches !
-- Lucid Lynx --
Hors ligne
#5 Le 08/08/2008, à 13:53
- yag00
Re : [Resolu]Shell : recupération de données dans une chaine
merci
j'avais corrigé l'erreur du double pipe
en fait le problème ne vient pas de la commande cut qui fonctionne très bien mais de l'affectation de la valeur dans le tableau
for (( i=1; i<=$nbfield; i++ ))
do
echo $i
field=$(echo ${fields}|cut -f${i} -d",")
echo $field
done
me renvoi bien
1
field1
2
field2
3
field3
si je fais
for (( i=1; i<=$nbfield; i++ ))
do
echo $i
field[$i]=$(echo ${fields}|cut -f${i} -d",")
echo $field[$i]
done
j'obtiens
1
[1]
2
[2]
3
[3]
Hors ligne
#6 Le 08/08/2008, à 14:05
- Totor
Re : [Resolu]Shell : recupération de données dans une chaine
Bon, voilà encore plus simple. Tu remplaces tout le code par :
field=($(${commande}| sed '/^field:/!d;s/field://;s/,/ /g'))
et la variable field est de type tableau et contient tout tes fields.
Attention, l'indice du tableau commence à 0.
Pour accèder à un élément du tableau :
echo ${field[<indice>]}
et normalement, la taille est donnée comme suit :
echo ${#field}
mais je ne comprends pas, ça donne toujours 1 (alors qu'avec le tableau que j'ai utilisé, il y avait 3 éléments)
enfin : pour afficher la totalité du tableau :
echo ${field[*]}
-- Lucid Lynx --
Hors ligne
#7 Le 08/08/2008, à 14:09
- yag00
Re : [Resolu]Shell : recupération de données dans une chaine
merci beacoup pour ton aide
ca marche nickel
et le code précédent marchait aussi
c'est juste que j'ai oublié les {}
echo $field[$i] == faux
echo ${field[$i]} ==
Hors ligne
#8 Le 08/08/2008, à 14:51
- Totor
Re : [Resolu]Shell : recupération de données dans une chaine
ok, c'est cool.
Entre deux, j'ai compris pourquoi ${#field} me retournait toujours 1...
Tout simplement car ce n'est pas la bonne syntaxe
alors la voici :
echo ${#field[*]}
...
-- Lucid Lynx --
Hors ligne
#9 Le 08/08/2008, à 16:41
- HP
Re : [Resolu]Shell : recupération de données dans une chaine
super intéressant !
Je ne savais même pas que les tableaux existaient en bash… j'avais encore rien lu à ce sujet, ni sur le web, ni dans mes bouquins (qui ne doivent pas être assez bon, d'ailleurs)…
cat /dev/urandom >/dev/null 2>&1 #github
Hors ligne