IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

awk et parcours de tableau (illegal reference to variable)


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 2
    Par défaut awk et parcours de tableau (illegal reference to variable)
    Bonjour, je bloque sur un message d'erreur concernant awk et le parcourt d'un tableau.

    J'ai un fichier qui contient les lignes suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >AFG01-PJ0
    TGTACAAGACCCAACAACAACACAAGAAAAAGTATACATATAGGACCAGGAAGAGCA
    TTTTCTGCAACAGGACAAATAATAGGAAAGATAAGAGAAGCACACTGT
    >AFG02-M93
    TGTACAAGACCCAACAACAACACAAGAAAAAGTATACATATAGGACCAGGAAGAGCA
    TTTTATGCAACAGGAGAAATAATAGGAAACGTAAGAGAAGCACATTGT
    Le séparateur de champs du fichier est -

    voici mon script awk :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #! /bin/bash
     
    nbStades=3
    tabStade=('PJ0' 'M93' 'M156')
     
    awk -F"-" -v nbStades="$nbStades" -v tab="${tabStade[*]}" '{ 
    if($1 ~ /^>/) {
    		print nbStades
    		print tab
    		for (x in tab)  {print "Valeur tab : " x}
    		}
    }' $1
    Lorsque j'exécute ce code avec mon fichier en argument, j'obtiens l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk: line 5: illegal reference to variable tab
    Et dans le cas où je supprime la ligne 10 (boucle for), mon script s'exécute correctement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    3
    PJ0 M93 M156
    3
    PJ0 M93 M156
    Mon tableau tabStade est donc bien déclaré dans la variable tab.
    Quelqu'un voit il mon erreur, merci?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Je crois que tu confonds 2 méthode d'utilisation des tableaux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    echo "Methode 1"
    tabStade=('PJ0' 'M93' 'M156')
    for ((i=0; i <${#tabStade[*]}; i++))
    do
    echo "Valeur tab: " ${tabStade[$i]}
    done
     
    echo "Methode 2"
    tabStade="PJ0 M93 M156"
    for i in $tabStade
    do
    echo "Valeur tab: " $i
    done
    Je regarde comment corriger ton awk

  3. #3
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 349
    Par défaut
    Bonjour,

    C'est surtout que tab n'est pas un tableau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ tabStade=('PJ0' 'M93' 'M156')
    $ echo toto | awk -v  tab="${tabStade[*]}" '{print tab[1]}'
    awk: {print tab[1]}
    awk:             ^ use of non-array as array

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    Bonjour,

    Citation Envoyé par Mesmeraf
    Mon tableau tabStade est donc bien déclaré dans la variable tab.



    ecatomb:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    echo "méthode #3"
    tableau=('PJ0' 'M93' 'M156')
    for i in "${tableau[@]}"; do echo "$i"; done
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Invité
    Invité(e)
    Par défaut
    N_BaH: Tricheur :p

    Et pourquoi pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo "méthode #4"
    for i in "PJ0' 'M93' 'M156'"; do echo "$i"; done


    Bon sinon j'ai du mal avec son awk...
    Pas trouvé comment passer un tableau dans le awk ou l'initialiser en une seule fois ... pas taper svp ...

    Voici ce que je propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    awk -F"-" -v nbStades="$nbStades" '{ 
    BEGIN {
    print nbStades
    tab[0]="PJ0"
    tab[1]="M93"
    tab[2]="M156"
    }
     
    if($1 ~ /^>/) {
    		for (x in tab)  {print "Valeur tab : " tab[x]}
    		}
    }' $1

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 2
    Par défaut
    Merci à tous les 3 pour la rapidité de vos réponses

    Je ne connaissais pas la fonction split() de awk, du coup j'ai pu l'utiliser avec succès à défaut de pouvoir intégrer un tableau comme variable externe dans awk.

    Mon code donne ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #! /bin/bash
     
    nbStades=3
    tabStade=('PJ0' 'M93' 'M156')
     
    awk -F"-" -v nbStades="$nbStades" -v vtmp="${tabStade[*]}" '{ 
    split(vtmp,tab," ")
    if($1 ~ /^>/) {
    		print nbStades
    		for (x in tab)  {print "Valeur tab : " tab[x]}
    		}
    }' $1
    et j'obtiens bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    3
    Valeur tab : PJ0
    Valeur tab : M93
    Valeur tab : M156
    3
    Valeur tab : PJ0
    Valeur tab : M93
    Valeur tab : M156
    ça m'a permis également de remettre les choses au clair sur les tableaux en Shell que je ne maîtrisais pas vraiment

  7. #7
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 349
    Par défaut
    Euh, on m'a interrompu sur ma lancé, donc si tu veux traiter sous un tableau, voici un exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo toto | awk -v  vtmp="${tabStade[*]}" '{split(vtmp,tab) ; print tab[3]}'
    M156
    ou (avec le séparateur du split):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo toto | awk -v  vtmp="${tabStade[*]}" '{split(vtmp,tab," ") ; print tab[3]}'
    M156

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Tableaux] Parcours de tableau multidimension
    Par grunk dans le forum Langage
    Réponses: 3
    Dernier message: 27/07/2007, 10h30
  2. Recherche et parcours de tableau
    Par LEK dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 31/05/2007, 21h41
  3. Code javascript qui parcours un tableau
    Par Taz_8626 dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 28/03/2006, 08h46
  4. Parcours de tableau et optimisation
    Par mik007 dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 22/11/2005, 09h57
  5. [Debutant(e)]Pb parcours de tableau
    Par joquetino dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 22/09/2004, 09h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo