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

Unix Discussion :

Comment obtenir en retour à l'appel à une fonction de type 'awk' des valeurs ?


Sujet :

Unix

  1. #1
    Candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Comment obtenir en retour à l'appel à une fonction de type 'awk' des valeurs ?
    Bonjour,

    Je sollicite votre concours pour obtenir dans le programme ci-dessous en retour à l’appel de la fonction ‘RECHERCHE’, la nouvelle valeur de la variable ‘RetChr’ à savoir ‘Rouge’ qui au départ est initialisée avec 'Blanc'. J’ai portant utilisé l’instruction ‘awk -v RetAwk=$RetChr‘ qui est préconisée pour redéfinir une variable dans ces conditions mais apparemment cela ne fonctionne pas comme ça. Pourquoi ?

    Plus généralement, je souhaiterais récupérer sous la forme d’une structure de variables, un peu comme en langage ‘C’, les éléments qui ont été mis dans le tableau ‘TabPoste’ lors à l’exécution de la fonction ‘RECHERCHE’.

    D’avance merci pour votre aide.
    JBM-33 -

    Ci-dessous les données du problème :

    Le programme :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    #!/bin/ksh
     
    #------------------------------------------------------------------------------
    # Récupération du nom de fichier.
    #------------------------------------------------------------------------------
    BASEDIR=`pwd`
    FICHIER_LISTE=$BASEDIR/liste_des_fichiers_à_dédoublonner.lst
    FICHIER_CHECH=B1DEC.AZ.EM0PS29.ECHANGE1.B1DJOD09
     
    echo "\nNom du fichier recherché : $FICHIER_CHECH."
     
    #------------------------------------------------------------------------------
    # Nombre d'enregistrements valides contenu dans le fichier.
    #------------------------------------------------------------------------------
    NB_ENREG=`cat $FICHIER_LISTE | cut -c 1 | grep -v \# | wc -l | tr -d " "`
    echo "Nombre d'éléments dans la liste : $NB_ENREG."
    echo "Le Répertoire et nom du fichier : $FICHIER_LISTE."
    RetChr=Blanc
    echo "Valeur de RetChr : "$RetChr"."
     
    #------------------------------------------------------------------------------
    # Boucle sur le fichier des noms de fichiers à plat.
    #------------------------------------------------------------------------------
    RECHERCHE()
    {
        TABENREG=
        awk -v RetAwk=$RetChr -F"~" '
        BEGIN{
           OFS="~"
           system(" echo \"\n    Début de fonction 'RECHERCHE'.\" ")
           CodeRetour=0      
        }
     
        !/^#/ {   
          for (IndChamp=1 ; IndChamp<=NF ; IndChamp++) {
             TabPoste[NR,IndChamp]=$IndChamp
             if (TabPoste[NR,IndChamp] == "'$FICHIER_CHECH'") {
                print "\n    * Pour contrôle, affichage du "NR"ème enregistrement traité."
                print "    * Pour l enregistrement n° "NR", "NF" champs sont présents : "
                print "   - Le fichier : '$FICHIER_CHECH' est présent sur le champ["NR","IndChamp"]."
             }
             if (TabPoste[NR,2] == "'$FICHIER_CHECH'" && IndChamp == 3) {
               print "     . Pour ce fichier le nom générique est                        : "TabPoste[NR,3]"."
             }
             if (TabPoste[NR,2] == "'$FICHIER_CHECH'" && IndChamp == 4) {
               print "     . Pour ce fichier l identifiant de la caisse est              : "TabPoste[NR,4]"."
             }
             if (TabPoste[NR,2] == "'$FICHIER_CHECH'" && IndChamp == 5) {
               print "     . Pour ce fichier le nom du traitement séquenceur est         : "TabPoste[NR,5]"."
             }
             if (TabPoste[NR,2] == "'$FICHIER_CHECH'" && IndChamp == 6) {
               print "     . Pour ce fichier le nom de la Caisse d Épargne est           : "TabPoste[NR,6]"."
             }  
             if (TabPoste[NR,2] == "'$FICHIER_CHECH'" && IndChamp == 7) {
               print "     . Pour ce fichier l identifiant du processus utilisateur est : "TabPoste[NR,7]"."
             }
             if (TabPoste[NR,2] == "'$FICHIER_CHECH'" && IndChamp == 8) {
               print "     . Pour ce fichier l item du processus utilisateur est         : "TabPoste[NR,8]"."
             }
             if (TabPoste[NR,2] == "'$FICHIER_CHECH'" && IndChamp == 9) {
               print "     . Pour ce fichier les critères et positions du tri sont       : "TabPoste[NR,9]"."
               CodeRetour=1
             }
        }
     } 
     
      END {
             print "\n    * FIN de la boucle : "NR" enregistrements lus.\n"
             RetAwk = "Rouge"
             print "\n    . Dans la boucle de RECHERCHE, valeur de la variable RetChr : '$RetChr'."
             print "    . Dans la boucle de RECHERCHE, valeur de la variable RetAwk : "RetAwk".\n"
             if (CodeRetour == 1) { exit 2 } else { exit 0 }
      }
      ' $FICHIER_LISTE
    }
     
    #------------------------------------------------------------------------------
    # Appel de la fonction RECHERCHE.
    #------------------------------------------------------------------------------
    RECHERCHE
     
    RetJob=$?
    echo "\n* Valeur de l'indicateur de recherche : "$RetJob".\n"
     
    echo "  Contenu de la variable 'RetChr' après l'exécution de la fonction 'RECHERCHE' : "$RetChr".\n"
    echo "  Ici je souhaiterai obtenir la nouvelle valeur affectée à la variable 'RetChr' dans la fonction 'RECHERCHE',"
    echo "  c'est à dire 'Rouge' puisqu'il y a eu redéfinition de celle-ci par l'instruction 'awk -v RetAwk=\$RetChr'...\n"
     
    #------------------------------------------------------------------------------
    # Fin du programme.
    #------------------------------------------------------------------------------
    Résultat lors de l’exécution du programme :
    Nom du fichier recherché : B1DEC.AZ.EM0PS29.ECHANGE1.B1DJOD09.
    Nombre d'éléments dans la liste : 11.
    Le Répertoire et nom du fichier : /prod01/dwh/appli/composant_ORACLE/liste_des_fichiers_à_dédoublonner.lst.
    Valeur de RetChr : Blanc.

    Début de fonction RECHERCHE.

    * Pour contrôle, affichage du 9ème enregistrement traité.
    * Pour l enregistrement n° 9, 9 champs sont présents :
    - Le fichier : B1DEC.AZ.EM0PS29.ECHANGE1.B1DJOD09 est présent sur le champ[9,2].
    . Pour ce fichier le nom générique est : x1DJOD09.
    . Pour ce fichier l identifiant de la caisse est : B.
    . Pour ce fichier le nom du traitement séquenceur est : PTRM_IMMB.
    . Pour ce fichier le nom de la Caisse d Épargne est : CEB.
    . Pour ce fichier l identifiant du processus utilisateur est : s7dece1.
    . Pour ce fichier l item du processus utilisateur est : s7dece1.
    . Pour ce fichier les critères et positions du tri sont : -k 4,5 -k 7,7.

    * FIN de la boucle : 9 enregistrements lus.


    . Dans la boucle de RECHERCHE, valeur de la variable RetChr : Blanc.
    . Dans la boucle de RECHERCHE, valeur de la variable RetAwk : Rouge.


    * Valeur de l'indicateur de recherche : 2.

    Contenu de la variable 'RetChr' après l'exécution de la fonction 'RECHERCHE' : Blanc.

    Ici je souhaiterai obtenir la nouvelle valeur affectée à la variable 'RetChr' dans la fonction 'RECHERCHE',
    c'est à dire 'Rouge' puisqu'il y a eu redéfinition de celle-ci par l'instruction 'awk -v RetAwk=$RetChr'...
    Contenu du fichier en entrée :
    ~N1DEC.AZ.EM0PS12.ECHANGE1.L1DJOBA3~x1DJOBA3~L~CONT~CEBN~s7dece1~s7dece1~-k 4,4
    ~B1DEC.AZ.EM0PS12.ECHANGE1.B1DJOBA3~x1DJOBA3~B~CONT~CEB~s7dece1~s7dece1~-k 4,4
    ~D1DEC.AZ.EM0PS12.ECHANGE1.E1DJOBA3~x1DJOBA3~E~CONT~CEAN~s7dece1~s7dece1~-k 4,4
    ~D1DEC.AZ.EM0PS12.ECHANGE1.F1DJOBA3~x1DJOBA3~F~CONT~CEPA~s7dece1~s7dece1~-k 4,4
    ~C1DEC.AZ.EM0PS12.ECHANGE1.C1DJOBA3~x1DJOBA3~C~CONT~CEIDFP~s7dece1~s7dece1~-k 4,4
    ~N1DEC.AZ.EM0PS12.ECHANGE1.H1DJOBA3~x1DJOBA3~H~CONT~CEHN~s7dece1~s7dece1~-k 4,4
    ~D1DEC.AZ.EM0PS12.ECHANGE1.G1DJOBA3~x1DJOBA3~G~CONT~CEPC~s7dece1~s7dece1~-k 4,4
    ~N1DEC.AZ.EM0PS29.ECHANGE1.L1DJOD09~x1DJOD09~L~PTRM_IMMB~CEBN~s7dece1~s7dece1~-k 4,5 -k 7,7
    ~B1DEC.AZ.EM0PS29.ECHANGE1.B1DJOD09~x1DJOD09~B~PTRM_IMMB~CEB~s7dece1~s7dece1~-k 4,5 -k 7,7
    ~D1DEC.AZ.EM0PS29.ECHANGE1.E1DJOD09~x1DJOD09~E~PTRM_IMMB~CEAN~s7dece1~s7dece1~-k 4,5 -k 7,7
    ~D1DEC.AZ.EM0PS29.ECHANGE1.F1DJOD09~x1DJOD09~F~PTRM_IMMB~CEPA~s7dece1~s7dece1~-k 4,5 -k 7,7

  2. #2
    Membre éclairé Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Points : 652
    Points
    652
    Par défaut
    .../...
    la nouvelle valeur de la variable ‘RetChr’ à savoir ‘Rouge’ qui au départ est initialisée avec 'Blanc'. J’ai portant utilisé l’instruction ‘awk -v RetAwk=$RetChr‘ qui est préconisée
    .../...


    Comme il se fait tard, je te poste ma solution sans commentaire.
    Je te laisse le temps de la réflexion


    Script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    .../...
    RECHERCHE()
    {
        TABENREG=
        RetChr=`awk -v RetAwk=$RetChr -v FICHIER_CHECH=$FICHIER_CHECH -F"~" -f awk.cmd $FICHIER_LISTE`
    }
    .../...

    Fichier de commande de awk à part (awk.cmd) :


    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
        BEGIN{
           OFS="~"
           print "\n    Début de fonction 'RECHERCHE'." | "cat 1>&2" 
           CodeRetour=0      
        }
     
        !/^#/ {   
          for (IndChamp=1 ; IndChamp<=NF ; IndChamp++) {
             TabPoste[NR,IndChamp]=$IndChamp
             if (TabPoste[NR,IndChamp] == FICHIER_CHECH) {
                print "\n    * Pour contrôle, affichage du "NR"ème enregistrement traité." | "cat 1>&2" 
                print "    * Pour l enregistrement n° "NR", "NF" champs sont présents : " | "cat 1>&2"
                print "   - Le fichier :FICHIER_CHECHest présent sur le champ["NR","IndChamp"]." | "cat 1>&2"
             }
             if (TabPoste[NR,2] == FICHIER_CHECH && IndChamp == 3) {
               print "     . Pour ce fichier le nom générique est                        : "TabPoste[NR,3]"." | "cat 1>&2"
             }
             if (TabPoste[NR,2] == FICHIER_CHECH && IndChamp == 4) {
               print "     . Pour ce fichier l identifiant de la caisse est              : "TabPoste[NR,4]"." | "cat 1>&2"
             }
             if (TabPoste[NR,2] == FICHIER_CHECH && IndChamp == 5) {
               print "     . Pour ce fichier le nom du traitement séquenceur est         : "TabPoste[NR,5]"." | "cat 1>&2"
             }
             if (TabPoste[NR,2] == FICHIER_CHECH && IndChamp == 6) {
               print "     . Pour ce fichier le nom de la Caisse d Épargne est           : "TabPoste[NR,6]"." | "cat 1>&2"
             }  
             if (TabPoste[NR,2] == FICHIER_CHECH && IndChamp == 7) {
               print "     . Pour ce fichier l identifiant du processus utilisateur est : "TabPoste[NR,7]"." | "cat 1>&2"
             }
             if (TabPoste[NR,2] == FICHIER_CHECH && IndChamp == 8) {
               print "     . Pour ce fichier l item du processus utilisateur est         : "TabPoste[NR,8]"." | "cat 1>&2"
             }
             if (TabPoste[NR,2] == FICHIER_CHECH && IndChamp == 9) {
               print "     . Pour ce fichier les critères et positions du tri sont       : "TabPoste[NR,9]"." | "cat 1>&2"
               CodeRetour=1
             }
        }
     } 
     
      END {
             print "\n    * FIN de la boucle : "NR" enregistrements lus.\n" | "cat 1>&2"
             RetAwk = "Rouge"
             print RetAwk
             print "\n    . Dans la boucle de RECHERCHE, valeur de la variable RetChr : '$RetChr'." | "cat 1>&2"
             print "    . Dans la boucle de RECHERCHE, valeur de la variable RetAwk : "RetAwk".\n" | "cat 1>&2"
             if (CodeRetour == 1) { exit 2 } else { exit 0 }
      }

  3. #3
    Candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 4
    Points : 4
    Points
    4
    Par défaut UNIX - Retour à l'appel à une fonction de type 'awk' des valeurs ? (Suite)
    Bonjour,

    J'ai codé l'instruction préconisée dans le programme mais lors de son exécution j'obtiens l'erreur suivante :
    "syntax error The source line is 2.
    The error context is
    >>> RetChr=` <<<
    awk: Quitting
    The source line is 2."

    Voici la partie du programme concerné :
    ... / ...
    RECHERCHE()
    {
    TABENREG=
    awk -F"~" '
    RetChr=`awk -v RetAwk=$RetChr -v FICHIER_CHECH=$FICHIER_CHECH -F"~" -f awk.cmd $FICHIER_LISTE`
    ... / ...
    ' $FICHIER_LISTE
    }
    ... / ...

    J'ai pourtant essayé d'autres solutions pour intégrer l'instructrion dans le code source mais des erreurs, certes différentes, sont retournées.
    J'ai effectivement besoin d'une explication, notamment sur le lien qu'il faut faire entre la première partie du code : 'RetChr=`awk -v RetAwk=$RetChr...' et la seconde illustrée par : 'BEGIN {...' . Cette dernière étant précédée de la phrase 'Fichier de commande de awk à part (awk.cmd) :'.
    D'avance merci de votre concours.
    JBM-33 -

  4. #4
    Membre éclairé Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Points : 652
    Points
    652
    Par défaut
    Il existe 2 façons de soumettre des commandes à awk

    - entre 2 simples quotes, comme tu l'as fait
    - dans un fichier à part qui est appelé en argument de -f

    http://lea-linux.org/cached/index/Dev-awk.html


    Exemple :

    awk -v RetAwk=$RetChr -v FICHIER_CHECH=$FICHIER_CHECH -F"~" ' liste_des_commandes_awk ' $FICHIER_LISTE

    awk -v RetAwk=$RetChr -v FICHIER_CHECH=$FICHIER_CHECH -F"~" -f awk.cmd $FICHIER_LISTE


    Ci-après, en rouge, ce qui ne colle pas :

    RECHERCHE()
    {
    TABENREG=
    awk -F"~" '
    RetChr=`awk -v RetAwk=$RetChr -v FICHIER_CHECH=$FICHIER_CHECH -F"~" -f awk.cmd $FICHIER_LISTE`
    ... / ...
    ' $FICHIER_LISTE

    }
    ... / ...

Discussions similaires

  1. Réponses: 4
    Dernier message: 04/04/2011, 12h15
  2. Appeler une fonction du type CreateFcn
    Par cococococococo dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 22/06/2007, 04h22
  3. comment appeler une fonction JAVA en JAVASCRIPT ?
    Par heleneh dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 13/09/2005, 12h21
  4. comment appeler une fonction JAVA en JAVASCRIPT ?
    Par heleneh dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 13/09/2005, 12h04
  5. Comment appeler une fonction JavaScript depuis Delphi ?
    Par Alfred12 dans le forum Web & réseau
    Réponses: 4
    Dernier message: 17/06/2005, 18h15

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