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 :

Variables combinées dans une boucle


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2016
    Messages : 18
    Par défaut Variables combinées dans une boucle
    Bonjour

    Je dois effectuer une commande awk sur des fichiers dont le nom est stéréotypé, comprenant année et nom de table, et ceci afin de récupérer un champ que je souhaite nommer num_table_annee.

    Mon problème est la combinaison de variables dans shell, dont je sais qu'elle est impossible "simplement".
    Il semble s'agir ici d'une triple substitution, et j'ai tenté d'utiliser eval, array, sans succès...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    annee=(11 12 13 14 15)
    table=(A B C D E F)
     
    for a in ${annee[@]}
    do
        for t in ${table[@]}
        do
    	<table_$table_$annee awk [...] > num_$annee_$table
        done
    done
    Est il possible de réaliser cette boucle ? Cet exemple minimal s'inscrit dans une boucle plus large, raison pour laquelle j'ai vraiment besoin d'une boucle. Ceci dit, si une autre solution plus intelligente existe, je suis preneur.
    Merci ++

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

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

    le caractère de soulignement (_) n'étant pas un caractère spécial, il est identifié par le shell comme faisant partie du nom de la variable : le shell utilise une variable $table_ qui n'existe pas.
    il faut mettre le nom entre accolades : ${table}_.


    NB : veille à mettre les variables et les tableaux entre guillemets, toujours.

    NB#2 : en exposant mieux ton problème, on pourrait te dispenser de ces boucles imbriquées.
    par exemple, on pourrait lister les fichiers, et décomposer leur nom pour récupérer les infos utiles
    ...
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2016
    Messages : 18
    Par défaut
    Merci beaucoup!
    effectivement j'aurais du donner un peu plus de détail car j'ai encore un souci.

    Mon but:
    - récupérer le numéro de colonne d'un champ spécifique PATTERN dans des fichiers dont le nom est stéréotypé. Pour rendre le script plus facile à lire et plus facile à modifier, je pensais stocker le chemin absolu dans une variable... et pouvoir ainsi faire la boucle sur le nom de cette variable, comprenant année et table.
    - l'objectif ensuite est d'utiliser ce numero de champ pour modifier et créer une table de synthèse.

    Mon code deviendrait alors pour ce premier tiret
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    annee="(11 12 13 14 15)"
    table="(A B C D E F)"
     
     
     
    for a in ${annee[@]}
    do
        for t in ${table[@]}
        do
    	<table_${table}_${annee} awk [...] > num_${annee}_${table}
        done
    done
    Le problème est que si je stocke le nom de fichier dans une variable, je n'arrive pas à le réutiliser après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    annee="(11 12 13 14 15)"
    table="(A B C D E F)"
     
    table_A_11="/Users/xxx/xxx/ttt.csv"
    [... etc, ou éventuellement dans une boucle]
     
    for a in ${annee[@]}
    do
        for t in ${table[@]}
        do
    	<${table_${table}_${annee}} awk [...] > num_${annee}_${table}
        done
    done
    Comme je le disais, j'ai essayé avec export puis la notation ${!table_${table}_${annee}} mais cela de substitue pas correctement non plus... tout comme la réutilisation de la valeur stockée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo ${num_${annee}${table}}
    J'ai également essayé avec eval, sans succès

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    c'est pas clair, ton problème.
    j'ai l'impression que tu mélanges tout.

    on reprend depuis le début :
    tu as des fichiers dans un répertoire que tu veux traiter avec awk.

    pour chaque fichier, quelles sont les opérations à effectuer (point par point, s'il te plaît) ?

    mets des exemples, avant/après.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2016
    Messages : 18
    Par défaut
    Désolé
    je reprends.

    Dans un répertoire, j'ai une liste de fichiers csv dont le nom est sous la forme suivante: table_TABLE_ANNEE ou TABLE peut prendre les valeurs A B C D E F et ANNEE 11 12 13 14 15.
    Dans ces fichiers, je veux chercher le numéro d'un champ particulier PATTERN et stocker ce numéro dans une variable que je peux réutiliser plus tard dans le script.

    Je pourrais répéter la ligne de code pour chaque fichier mais je ne trouvais pas cela très malin, et surtout pas du tout réutilisable.
    Pour chercher le numéro de champ, j'utilise la fonction awk ci-dessus.

  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    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 347
    Par défaut
    Bonjour,
    Un exemple de comment pratiquer en pur BASH ( donc pas sh ou ksh, ou autre shell ) (Si j'ai bien compris le problème) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ table_A_11="/Users/xxx/xxx/ttt.csv"
    $ foo=A
    $ bar=11
    $ var="table_${foo}_${bar}"
    $ echo "${var}"
    table_A_11
    $ echo "${!var}"
    /Users/xxx/xxx/ttt.csv
    Donc ici, je fabrique le nom de la variable et je le met dans une variable que j'ai pour l'exemple appeler var, ensuite, il reste à la déréférencer, ce qui se fait en bash par la syntaxe ${!var}.

    PS: le $ en début de ligne est mon prompt.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    oui, mais non, là on complique une chose simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for f in /Users/xxx/xxx/*.csv
    do
       IFS='_' read -a parts <<<"$f"
       printf 'racine = %s\ntable = %s\nannée = %s\n****\n'  "${parts[@]}"
    #   ensuite on reconstitue le nom avec les éléments du tableau ${parts[@]}
    done
    si besoin, on peut au préalable séparer le chemin vers les fichiers...

    ou, pour être plus "indicatif" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for f in /Users/xxx/xxx/*.csv
    do
       IFS='_' read racine table annee <<<"$f"
       printf 'racine = %s\ntable = %s\nannée = %s\n****\n'  "$racine" "$table" "$annee"
    #   ensuite on reconstitue le nom avec les variables $racine $table et $annee
    done
    edit:
    stocker ce numéro dans une variable que je peux réutiliser plus tard dans le script.
    en dehors de la boucle ? pourquoi ?
    on pourrait éventuellement utiliser un tableau associatif qui reprendrait le nom du fichier.
    mais, là encore, on n'en sait pas assez sur l'algo...
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2016
    Messages : 18
    Par défaut
    Merci N_Bah mais je n'arrive probablement pas à bien expliquer ce que je veux faire.
    Quand j'utilise ta commande, je ne peux (sais) pas réutiliser les données extraites.

    Mon idée est d'utiliser les "identifiants personnalisés" des tables (i.e. année et nom de table) pour stocker des variables identifiées de la même façon.
    Ainsi, quand je travaille avec la table table_A_11, je veux pouvoir avoir une variable num_champ_A_11 et ainsi faciliter (je pensais à une double boucle, mais peut-être est-ce la mauvais solution) l'identification et surtout la "généralisation" du script (si jamais l'année prochaine j'ai aussi l'année 16 par exemple)

    Désolé de ne pas pouvoir être plus clair

  9. #9
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2016
    Messages : 18
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    ou, pour être plus "indicatif" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for f in /Users/xxx/xxx/*.csv
    do
       IFS='_' read racine table annee <<<"$f"
       printf 'racine = %s\ntable = %s\nannée = %s\n****\n'  "$racine" "$table" "$annee"
    #   ensuite on reconstitue le nom avec les variables $racine $table et $annee
    done
    désolé je n'avais pas vu la fin de ton message

    Citation Envoyé par N_BaH Voir le message
    edit:
    en dehors de la boucle ? pourquoi ?
    on pourrait éventuellement utiliser un tableau associatif qui reprendrait le nom du fichier.
    mais, là encore, on n'en sait pas assez sur l'algo...
    Par année, il y a plusieurs tables de travail. Dans ces tables, il y a un identifiant (celui dont je cherche le numéro de colonne). Mon but final est de sélectionner dans chacune de ces tables les données qui m'intéressent pour les mettre dans un seul fichier par année. Et donc d'obtenir un fichier de synthèse par année. D'où mon idée de boucler sur l'année

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    comme je l'ai montré, dans la boucle qui liste les fichiers, tu décomposes le nom du fichiers, et donc ta recherche dans le fichier peut être redirigée (par ajout (>>), au lieu d'écraser (>)) vers le fichier correspondant à l'année indiquée dans le nom.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for f in "$chemin"/*.csv
    do
       IFS='_' read racine table annee <<<"$f"
       <"$f" awk '/correspondance/{traitement;extraction;affichage}' >> "$destination/fichier_$annee"
    done
    si j'ai bien compris.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  11. #11
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2016
    Messages : 18
    Par défaut
    Ok merci, je crois que j'ai compris l'idée.
    Je vais essayer cela et mettrai resolu sur la discussion
    Merci encore

Discussions similaires

  1. [Spip] Insertion de variable PHP dans une boucle
    Par oceane751 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 02/11/2009, 21h03
  2. [Spip] Récupérer la valeur d'une variable PHP dans une boucle Spip
    Par papisdoums dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 10/04/2009, 19h03
  3. Nom de variables indexés dans une boucle FOR-END
    Par matthieu.gaudet dans le forum MATLAB
    Réponses: 2
    Dernier message: 26/05/2008, 18h11
  4. [Syntaxe] Variable locale dans une boucle for
    Par Kaeguri dans le forum C++
    Réponses: 3
    Dernier message: 04/05/2007, 09h09
  5. [XSLT] Réutiliser une variable définie dans une boucle
    Par DelphLaga dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 12/10/2006, 16h49

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