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] Appel de fonctions en cascade


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 32
    Par défaut [awk] Appel de fonctions en cascade
    Bonjour,

    Je souhaite utiliser dans un programme awk deux fonctions : l'une pour me compter le nombre de champs de la première ligne de mon fichier de données. Si ce nombre correspond à ce que je veux, je fais appel à ce moment-là à une autre fonction pour réaliser une autre tâche.

    Exemple de fonction pour compter le nombre de champs de la première ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function nbr_champ(nbr_champ_attendu)
     {
       if((NR==1) && (NF==nbr_champ_attendu)) {return 1}  
     }
    Exemple de fonction pour tester la longueur d'un champ de toute les lignes de mon jeu de données. Si ce champ est vide, alors le programme m'affichera la chaîne "OK".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function affiche(champ)
      {
      if (length(champ) == 0) print "OK"
      }
    Place au programme principale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    BEGIN {FS=";"}
    {
       nbr_champ(12)
       si nbr_champ me renvoie 1 alors appeler la fonction "affiche" pour tester la longueur du dixième champ "$10" 
       sinon, je ne fais rien
    } END
    En résumé, j'ai dû mal à gérer le return de ma première fonction.
    Merci d'avance pour votre aide.

  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,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/usr/bin/awk -f
     
    function nbr_champ(nbr_champ_attendu) {
       if(NF==nbr_champ_attendu) {return 1}
    }
     
    {
       if(nbr_champ(12))print $0,"ok"; else print $0,"ko"
    }
    ...
    ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 32
    Par défaut
    Merci pour votre réponse.
    Le code fonctionne bien.

    Ma question est comment dire à la première fonction qu'elle doit compter le nombre de champs que pour l'entête de mon fichier source ?. Je ne souhaite pas contrôler la structure de toutes les lignes composant mon fichier de données. Seule l'entête m'intéresse.

    In fine, si l'entête de mon fichier source ne respecte pas la structure attendue, ce dernier sera rejeté.

  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
    oops, ce n'est qu'un oubli:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/usr/bin/awk -f
     
    function nbr_champ(nbr_champ_attendu) {
       if((NR==1) && (NF==nbr_champ_attendu)) {return 1}
    }
     
    {
       if(nbr_champ(12))print $0,"ok"; else exit
    }
    mais bon, l'intérêt d'une fonction est de ne pas réécrire le code qu'elle contient à différent endroit d'un script.
    Or, ici, le code n'est exécuté qu'une fois, donc, selon moi, l'emploi d'une fonction n'est pas nécessaire.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 32
    Par défaut
    Merci

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/03/2008, 22h11
  2. Réponses: 4
    Dernier message: 19/04/2004, 13h41
  3. [JSP] Appeler une fonction
    Par Patrick95 dans le forum Servlets/JSP
    Réponses: 10
    Dernier message: 23/12/2003, 13h44
  4. Appel à des fonctions incluses dans des DLL
    Par Greybird dans le forum Langage
    Réponses: 3
    Dernier message: 26/05/2003, 13h33
  5. Appeler une fonction avec/sans parenthèses
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 29/12/2002, 18h48

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