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 :

Problème awk pour récuperer des champs


Sujet :

Shell et commandes GNU

  1. #1
    Candidat au Club
    Inscrit en
    Septembre 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 15
    Points : 4
    Points
    4
    Par défaut Problème awk pour récuperer des champs
    Bonjour,
    je souhaite récuperer le champs $2 sous certaines conditions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     for nom in $(awk 'BEGIN{FS=";"}{print $1}' < verif2.log )
     do
     
     for compte in $(awk 'BEGIN{FS=";"}{print $1}' < verif1.txt )
     
     do
     
    if [ $nom = $compte ]
     then
    # awk 'BEGIN{FS=";" ; nom_exp=$nom }{$1 == nom_exp} {print $2}' verif1.txt > resultat_final.log
    # awk '{if ($1 == $nom) {print $2} fi }' verif1.txt > resultat_final.log
     fi
     done
     done
    Merci pour la réponse

  2. #2
    Candidat au Club
    Inscrit en
    Septembre 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 15
    Points : 4
    Points
    4
    Par défaut awk et comparaison fichiers
    bonjour,
    j'ai testé les deux techniques (voir dans le commentaire du code shell #mais ça ne marche pas)
    pouvez-vous me dire comment je pourrais comparer la valeur d'une variable avec le premier champs d'un fichier , en cas d'égalité je récupere le deuxieme champs du fichier.?
    merci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    for nom in $(awk 'BEGIN{FS=";"}{print $1}' < verif2.log )
     do
     
     for compte in $(awk 'BEGIN{FS=";"}{print $1}' < verif1.txt )
     
     do
     
    if [ $nom = $compte ]
     then
    ##############################################
    awk 'BEGIN{FS=";" ; nom_exp=$nom }{$1 == nom_exp} {print $2}' verif1.txt > resultat_final.log
    awk '{if ($1 == $nom) {print $2} fi }' verif1.txt > resultat_final.log
    ################################################### 
    fi
     done
     done

  3. #3
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    Bonjour,
    Utilises les balises CODE pour rendre la lecture de ton code plus facile.

    Je n'ai pas la possibilité de tester, mais il me semble que tes simples cotes '...' empêchent l'interprétation de la variable $nom par le shell.

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    zooro a raison les cotes "bloque" l'interpretation de tes variables shell ....

    il te faut utiliser la passation d'argument avec awk :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     -v var=val
           --assign var=val
                  Assign the value val to the variable var, before execution of the  program  begins.
                  Such variable values are available to the BEGIN block of an AWK program.
     
     
    soite :
    awk -v var_awk=$var_shell 'prog awk'

  5. #5
    Candidat au Club
    Inscrit en
    Septembre 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    j'ai modifié la partie correspondantes :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for nom in $(awk 'BEGIN{FS=";"}{print $1}' < verif2.log )
     do
     
     for compte in $(awk 'BEGIN{FS=";"}{print $1}' < verif1.txt )
     
     do
    if [ $nom = $compte ]
     then
    ###########################################
    awk '{FS=";"}{if ($1 =='$nom') {print $2} fi}' verif1.txt > resultat_final.log
    #########################################
    le resultat :
    The input line number is 1. The file is verif1.txt.
    The source line number is 1.
    awk: A statement occurred that is not valid

  6. #6
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    Citation Envoyé par ab_2006
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{FS=";"}{if ($1 =='$nom') {print $2} fi}' verif1.txt > resultat_final.log
    le resultat :
    The input line number is 1. The file is verif1.txt.
    The source line number is 1.
    awk: A statement occurred that is not valid
    Euh... il faudrait peut-être mettre des guillements autour de ton $nom, non ?
    Et en plus, imagine que $nom="bla bla) bla". Après interprétation du shell, tu pourrais avoir un code awk du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {FS=";"}{if ($1 ==bla bla) bla) {print $2} fi}
    On comprend qu'il n'apprécie pas

  7. #7
    Candidat au Club
    Inscrit en
    Septembre 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    ça ne marche toujours pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{FS=";"}{if($1 =='$nom') {print $2} fi}' verif1.txt > resultat_final.log
    ci-dessous le message d'erreur :
    The input line number is 1. The file is verif1.txt.
    The source line number is 1.
    awk: A statement occurred that is not valid.
    Quelle est la regle ?
    merci par avance

  8. #8
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    Citation Envoyé par ab_2006
    ça ne marche toujours pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{FS=";"}{if($1 =='$nom') {print $2} fi}' verif1.txt > resultat_final.log
    Quelle est la regle ?
    merci par avance
    Je ne peux pas tester, alors pas de garantie de succès. Mais essaye comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{FS=";"}{if($1 =="'$nom'") {print $2} fi}' verif1.txt > resultat_final.log
    Ou sinon, essaye la solution donnée plus haut par MarcG.

  9. #9
    Candidat au Club
    Inscrit en
    Septembre 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    Merci zooro, mais ça ne marche toujours pas .


    The source line number is 1.
    awk: A statement occurred that is not valid.

    The input line number is 1. The file is verif1.txt.
    The source line number is 1.
    awk: A statement occurred that is not valid.


    merci a toute suggestion pour la résolution

  10. #10
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{FS=";"}{if($1 =='$nom') {print $2} fi}' verif1.txt > resultat_final.log
    Je n'avais pas percuté, mais le "fi", tu le sors d'où ?

    Essaye comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F';' '$1 == "'$nom'" { print $2 }' verif1.txt > resultat_final.log

  11. #11
    Candidat au Club
    Inscrit en
    Septembre 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    ça marche pour le premier enregistrement, ensuite il s'arrete.

    en avance, mais il manque un petit bout de code, pour récuperer tous les enregistrement sachant que j'ai déja deux boucles for.


    Merci à tous

  12. #12
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    Justement, en parlant des boucles, je relis ton code initial, et j'ai un peu de mal à suivre.
    Juste pour être sûr que j'ai bien compris ce que tu veux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Pour chaque $nom (1er champ de chaque ligne du fichier verif2.log) faire
       Pour chaque $compte (1er champ de chaque ligne du fichier verif1.txt) faire
          Si $nom = $compte faire
             Pour chaque ligne de verif1.txt, 
                Si le premier champ de la ligne (i.e. $compte) est $nom, 
                   afficher le deuxième champ
                finSi
             finPour
          finSi
       finPour
    finPour

  13. #13
    Candidat au Club
    Inscrit en
    Septembre 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    exa

  14. #14
    Candidat au Club
    Inscrit en
    Septembre 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    salut zooro

    exactement, tu as tous compris. je te confirme trois boucles for.

    merci

  15. #15
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    Je ne comprends pas à quoi sert cette partie du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for compte in $(awk 'BEGIN{FS=";"}{print $1}' < verif1.txt )
     do
    if [ $nom = $compte ]
     then
    Sauf erreur de ma part, elle fait la même chose que le awk qui suit...

  16. #16
    Candidat au Club
    Inscrit en
    Septembre 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    bonjour,

    le awk qui suit récupere le deuxieme champs du fichier verif1 a condition que
    le premier champs du fichier verif1=premier champs du fichier verif2.

    Question que je me pose y'a t-il un moyen de récupérér dans la boucle for une variable qui est composé de deux champs d'une ligne ensuite extraire de cette variable un champs de cette ligne.

    Merci

Discussions similaires

  1. Requête SQL pour obtenir les intitulés des champs d'une table
    Par Zakapatul dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 01/12/2008, 09h51
  2. Réponses: 1
    Dernier message: 22/11/2008, 10h36
  3. Réponses: 2
    Dernier message: 08/08/2007, 08h57
  4. cherche requette pour trouver le nom des champs dans une table
    Par maverick56 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 12/07/2007, 10h28
  5. Requête pour récupérer le nom des champs
    Par legillou dans le forum JDBC
    Réponses: 1
    Dernier message: 08/02/2006, 16h09

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