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:
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 :
Citation:
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 :
Citation:
~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
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 - :roll: