manipulation de contenu de fichier avec awk

manipulation de contenu de fichier avec awk - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 05-09-2005 à 18:17:06    

Bonjour
 
Etant pluôt débutant en script unix et malgré mes nombreux essais, je me heurte à un problème m'empêchant d'avancer dans mon développement :
 
J'ai un fichier tmp1 contenant un nombre variable de lignes (nous dirons 2 pour l'exemple) contenant chacune une chaine de 6 caractères :
ABCDEF
GHIJKL
Je souhaiterais créer à partir de cela un fichier tmp2 contenant :
VSRCABCDEFSITEDATE01
VSRCGHIJKLSITEDATE01
où :
V est la lettre "V"
SRC, SITE et DATE sont des variables définies antérieurement
 
j'ai essayé plusieurs commandes dont ces 2-là : ($DIR est déjà définie)
awk '{print "V"${SRC}$1${SITE}${DATE}"01"}' $DIR/tmp1 > $DIR/tmp2
et  
awk '{print "V"$SRC$1$SITE$DATE"01"}' $DIR/tmp1 > $DIR/tmp2
La 1ère se termine en erreur et la 2ème me génère le fichier tmp2 suivant :
VABCDEFABCDEFABCDEFABCDEF01
VGHIJKLGHIJKLGHIJKLGHIJKL01
mon problème est que je n'arrive pas à utiliser mes variables précédemment définies dans le "print" ...  :??:  
existe-t'il un moyen pour que ces variables soient interprétées correctement dans le "print" ou de contourner ce problème ?
 
Merci d'avance !


Message édité par DE-SK le 06-09-2005 à 12:40:33
Reply

Marsh Posté le 05-09-2005 à 18:17:06   

Reply

Marsh Posté le 05-09-2005 à 18:22:04    

il y a un chose qui ne va pas :
l'appel des variables SRC et SITE en effet tu rajoute un $ devant cela correspond alors au champ de la ligne n°SRC ou SITE.
Ex: si SRC=127.0.0.1 alors $SRC sera le champ "127.0.0.1" (plus exactement 1 ou 0 car ce n'est pas un nombre) -> ABCDEF
En d'autres termes, pas de $ avant la variable.


Message édité par jlighty le 05-09-2005 à 18:29:13
Reply

Marsh Posté le 06-09-2005 à 12:44:03    

Merci de la réponse ...
comme je l'ai dit avant, mes variables sont dans un fichier .ini que j'appelle par ". $DIR/INIT_TEMP.ini" en début du script ($DIR est définie dans le script lui-même)
je viens d'essayer les lignes :
awk '{print "V" (SRC) $1 (SITE) (DATE) "01" }' $DIR/tmp1 > $DIR/tmp2
et  
awk '{print "V" SRC $1 SITE DATE "01" }' $DIR/tmp1 > $DIR/tmp2
 
... malheureusement sans plus de succès ...
dans les 2 cas j'obtiens :
VABCDEF01
VGHIJKL01

Reply

Marsh Posté le 06-09-2005 à 13:00:41    

Les variables SRC, SITE et DATE sont des variable d'environnement ? ou elles sont passées par la ligne de commande awk ?
si variable environnement -> ENVIRON[var]
sinon : ARGV

Reply

Marsh Posté le 06-09-2005 à 14:55:15    

ce sont des variables que je définie par un script INIT.ksh qui génère le INIT_TEMP.ini que j'appelle en début de script pour aller y chercher les variables.
 
étant un peu limité en temps, je vais abandonner cette voie car je viens de trouver un moyen de contournement en utlisant un dénombrement des lignes dans le fichier contenant les chaines de 6 caractères, puis je génère un fichier de "préfixes" et un fichier de "suffixes" et je concatène les 3 ... ce n'est peut-être pas la méthode la plus "propre" mais ça marche bien et c'est facilement évolutif ...  
Merci encore pour les réponses ;)

Reply

Marsh Posté le 06-09-2005 à 18:13:22    

Si tu veux que le shell remplace tes variables d'environnement definie avant il ne faut pas mettre ta ligne awk entre simple quote ( ' ) mais entre double quote ( " )
 
Tu peux te passer de awk en faisant un truc du genre:
 
for i in $(cat tmp)
do
 echo V${SRC}${i}${DATE}01
done
 
Ou un truc du genre :D

Reply

Marsh Posté le 08-09-2005 à 10:18:41    

Sinon il me semble que pour appeler des vars exterieur a awk il faut faire un truc du genre : awk -v mavar ....


---------------
Never f**k with your systems administrator. Why? Because they know what you do with all that free time! |?? | SAVE Jericho !
Reply

Marsh Posté le 08-09-2005 à 10:27:39    

Oui on peut aussi utiliser les variables spécifiées par la ligne de commande
awk -v ma_variable=ma_valeur


Message édité par jlighty le 08-09-2005 à 10:27:54
Reply

Marsh Posté le 09-09-2005 à 00:57:29    

Oui, typiquement on fait awk -v TOTO=$TOTO '...'. Mettre le script awk entre double quotes, c'est generalemenent un mauvaise idee. En tout cas quand on ne sais pas trop ce qu'on fait. Et DE-SK n'as pas l'air de trop comprendre ce qu'il fait.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed