![]() |
| Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé. | |||||||
|
|||||||
| Unix Forum d'entraide sur les systèmes Unix et dérivés (*BSD, AIX, etc.). Avant de poster ->F.A.Q BSD F.A.Q. Aix |
![]() |
|
|
Outils de la discussion |
|
|
#1 (permalink) | ||
|
Invité de passage
![]() Date d'inscription: janvier 2008
Messages: 4
|
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 :
#!/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.
#------------------------------------------------------------------------------
Citation:
Citation:
Dernière modification par julp ; 18/03/2008 à 18h54 |
||
|
|
|
|
|
#2 (permalink) |
|
Membre éprouvé
![]() Date d'inscription: mars 2007
Localisation: Toulouse
Messages: 471
|
.../...
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 :
.../...
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 :
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 }
}
__________________
Loi de Murphy: La Théorie c'est quand ça ne marche pas mais que l'on sait pourquoi. La Pratique c'est quand ça marche mais qu'on ne sait pas pourquoi. Quand la théorie rejoint la pratique ça ne marche pas et on ne sait pas pourquoi. |
|
|
|
|
|
#3 (permalink) |
|
Invité de passage
![]() Date d'inscription: janvier 2008
Messages: 4
|
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 (permalink) |
|
Membre éprouvé
![]() Date d'inscription: mars 2007
Localisation: Toulouse
Messages: 471
|
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 } ... / ...
__________________
Loi de Murphy: La Théorie c'est quand ça ne marche pas mais que l'on sait pourquoi. La Pratique c'est quand ça marche mais qu'on ne sait pas pourquoi. Quand la théorie rejoint la pratique ça ne marche pas et on ne sait pas pourquoi. |
|
|
|
![]() |
![]() |
||
Comment obtenir en retour à l'appel à une fonction de type 'awk' des valeurs ?
|
||
| Outils de la discussion | |
|
|