Posez votre question Signaler

[awk] et variables

B@|-|@N 388Messages postés 15 janvier 2004Date d'inscription - Dernière réponse le 22 déc. 2009 à 16:01
Yo, messires CCmers.

Voilà mon code :
stat -c %y $DATA_DIR/fi.txt > $DATA_DIR/dr.txt;
_dr=`awk 'BEGIN {FS="."} {print $1}' $DATA_DIR/dr.txt`;
_ds=`date +%Y-%m-%d\ %H:%M:%S`;

awk 'BEGIN {FS="\t"} {print $1"\t"$11"\t"$7"\t"$_dr"\t"$_ds"\t0"}' $DATA_DIR/fbon.txt > $DATA_DIR/ffin.txt

Et je n'arrive pas a obtenir dans mon fichier ffin.txt la date $_ds ni la date $_dr. Comment puis-je intégrer des variables "exterieures" dans un awk ?

Bahan

Close the world.||.txen eht nepO
Lire la suite 

[awk] et variables »

22 réponses
Réponse
+0
moins plus
RE, re ;o)

Alors pour passer des variable à awk, il faut utiliser l'option -v (-v affectation)
En reprenant ton exemple:
_dr=`awk 'BEGIN {FS="."} {print $1}' $DATA_DIR/dr.txt`;
_ds=`date +%Y-%m-%d\ %H:%M:%S`;
Le awk doit commencer par:
awk -v _dr=$_dr -v _ds=$_ds 'BEGIN ...
Pour la suite, Dans awk les variables n'ont pas besoin d'un $ pour etre affichées, ceci est resevé aux lignes et champs de lignes ($0, $1, $2, etc.)
donc { print $_dr } esy incorrect, il faut utiliser { print _dr }

@++
...Mana mana
Tutudutu...
Ajouter un commentaire
Réponse
+0
moins plus
Merci.

Une autre question sur le gril : Pour eviter la premiere ligne de mon fichier ? Je dois utiliser NR ?

Car j'ai essayé un NR > 1 mais cela ne fonctionne pas :
awk 'BEGIN {FS="\t";NR>1} {print "blablabla"} $DATA_DIR/fichier1.txt > $DATA_DIR/fichier2.txt;

Bahan

Close the world.||.txen eht nepO
asevere - 16 sept. 2004 à 18:30
:)

BEn, il y a plusieurs méthodes, une consisterai a faire un teste sur NR, ou FNR, pour savoir ou on en est dans le traitement, mais c'est pas super classe :(
Il reste les fonction prédéfinies: next semble logique puisqu'elle permet de stoper le traitement et de lire le prochaine enregistrement avant de reprendre. Ceci dit, cette fonction ne colle pas dans un bloque BEGIN donc ça nous aides pas vraiment.
La fonction getline en revanche fait l'affaire :)
... awk 'BEGIN{getline} {...}...

$ ls -l|awk '{ print $1 }'
total
-rw-r--r--
-rw-r--r--
-rw-r--r--
$ ls -l|awk 'BEGIN{ getline }; { print $1 }'
-rw-r--r--
-rw-r--r--
-rw-r--r--
Il existe peut-etre une autre méthode plus direct, mais je ne la connais pas :)

@++
...Mana mana
   Tutudutu...
Ajouter un commentaire
Réponse
+0
moins plus
Nope, la fonction getline ne me supprime pas la premiere ligne T_T.
Voici le code quand même :
awk 'BEGIN {FS="\";getline;} {print $1"\t"$2"\t"$3"\t"$4"\t"$5" "$6" "$7"\t"$8"\t"$9"\t"$10"\t"$11}' $DATA_DIR/fi.txt > $DATA_DIR/fi2.txt;

Sinon j'ai aussi un autre pb :
ds=`date +%Y-%m-%d\ %H:%M:%S`;
awk -v dr=$dr -v ds=$ds 'BEGIN {FS="\t"} {print $1"\t"$11"\t"$7"\t"dr"\t"ds"\t0"}' $DATA_DIR/fbon.txt > $DATA_DIR/ffin.txt

En fait, comme vous pouvez le voir, la variable ds est une date (+heure). Or c'est justement l'heure qui me pose pb avec le caractere deux points.
awk: cmd. line:1: 15:51:19"
awk: cmd. line:1:   ^ parse error

Comment protéger ma variable ? Car j'ai bien l'impression que c'est cela qui pêche. Il essaye de'interpréter les ":" et cela ne lui réussit pas ^_^.

Bahan

Close the world.||.txen eht nepO
Ajouter un commentaire
Réponse
+0
moins plus
Ouh la la.

Bon je m'étais encore trompé (et vive les erreurs de syntaxe ^_^).
awk 'BEGIN {FS="\t";getline;} {print $1"\t"$2"\t"$3"\t"$4"\t"$5" "$6" "$7"\t"$8"\t"$9"\t"$10"\t"$11}' $DATA_DIR/fi.txt > $DATA_DIR/fi2.txt;

J'avais oublié le t du \t dans le begin. ^_^

Mais mon second pb perdure quand meme.

Bahan

Close the world.||.txen eht nepO
asevere - 17 sept. 2004 à 12:37
Autant, pour moi, j'avais pas poussé assez loin, alors dans le cas de la date, (ds=$ds) c'est a ce niveau là que ça coince et pas pendant l'affichage comme je le pensais
il suffit de bidouiller l'affectation:
ds="$ds"

@+
...Mana mana
   Tutudutu...
Ajouter un commentaire
Réponse
+0
moins plus
Nickel.

Merci pour ton aide Asevere.

Bahan

Close the world.||.txen eht nepO

PS : ca veut dire quoi mana mana ?
Ajouter un commentaire
Réponse
+0
moins plus
De rien :)

A plussse!
...Mana mana
   Tutudutu...
Ajouter un commentaire
Réponse
+0
moins plus
Bonsoir,

Merci aussi pour cette leçon magistrale !!!!
Particulièrement intéressante !!!!

bob
Ajouter un commentaire
Réponse
+0
moins plus
Bonjour,

je rencontre un pb similaire, mais je n'arrive pas à le résoudre avec vos explications, ni aucune autre sur le net ! je pete les plombs ca fait 3 jours que je suis sur cette ligne de commande à la #%!@ !!! :p

voila mon pb, si quelqu'un peut aider... :

je veux chercher une date ecrite dans un fichier, puis afficher la ligne avec la date, et quelques unes des lignes qui la suivent

alors chercher une date et afficher les lignes j y arrive

awk 'BEGIN { print "Rapport d erreur" ; print "------- -------" }
/"18/12/09"/ { print "\n\nErreur relevée : " ; print $1,$2,$3,$4,$5,$6,$7 ; getline ; print $0 ; getline ; print $0 } ' mon_fichier.err

sauf que quand je veux passer cette date par un PARAMETRE, je n'y arrive pas :

DATE="18/12/09"
awk 'BEGIN {date=$DATE} { print "Rapport d erreur" ; print "------- -------" }
/date/ { print "\n\nErreur relevée : " ; if ( $6 == date) { print $1,$2,$3,$4,$5,$6,$7 ; getline ; print $0 ; getline ; print $0 } } ' mon_fichier.err

>>me jète !!!
et si je déplace BEGIN apres la déf de la variable je me fais jeter, avec ou sans le -v

j'en peux plus, aidez moi s'il vous plaiiiiit :)
Ajouter un commentaire
Réponse
+0
moins plus
hello
essaye
DATE="18/12/09"
awk 'BEGIN {date='"$DATE"'}.{ print "Rapport d erreur" ; print "------- -------" }
$0 ~ date { print "\n\nErreur relevé....
Ajouter un commentaire
Réponse
+0
moins plus
correction
date="'"$DATE"'"}

parce que si je fais date=18/12/09 il va créer une variable numérique, 18 divisé par 12 divisé par 9, avec date="18/12/09" j'ai une date
Ajouter un commentaire
Réponse
+0
moins plus
ca ne fonctionne toujours pas : :-/


>DATE="18/12/09"
> awk 'BEGIN { _date='"$DATE"'} /_date/ { print $0 } ' monfichier
> awk 'BEGIN { _date="'"$DATE"'"} /_date/ { print $0 } ' monfichier

ne ramenent rien, alors que j'ai bien des lignes avec 18/12/09 ..
Ajouter un commentaire
Réponse
+0
moins plus
et
awk 'BEGIN { _date="'"$DATE"'"} ; $0 ~ _date { print $0 } ' monfichier 
Ajouter un commentaire
Réponse
+0
moins plus
awk: syntax error near line 1
awk: bailing out near line 1
Ajouter un commentaire
Réponse
+0
moins plus
dans awk : _date=guillemet quote guillemet $DATE guillemet quote guillemet }

$ DATE=18/12/09
$ 
$ cat a
18/12/09
aaa

$ awk 'BEGIN { _date="'"$DATE"'"} ; $0 ~ _date { print $0 } ' a
18/12/09
$ 
Ajouter un commentaire
Réponse
+0
moins plus
pas chez moi (pour info je suis sur Sun Solaris)

> echo $DATE
18/12/09
> cat /tmp/a
p
Q
r 18/12/09
q
Q
x
q
> awk 'BEGIN { _date="'"$DATE"'"} ; $0 ~ _date { print $0 } ' >
awk: syntax error near line 1
awk: bailing out near line 1
Ajouter un commentaire
Réponse
+0
moins plus
utilise nawk
GhostDJ - 22 déc. 2009 à 15:29
ca marche avec nawk ! mais par contre je ne comprends rien à ta ligne...

nawk 'BEGIN { _date="'"$DATE"'"} ; $0 ~ _date { print $0 }' toto

$0 ~ _date : veut dire que je cherche la chaine _date j'imagine ??

et si je veux imbriquer une seconde recherche avec le mot clé Erreur ?? comment je fais ?

un truc du genre :
nawk 'BEGIN { _date="'"$DATE"'"} ; $0 ~ _date ~ Erreur { print $0 }' toto
Ajouter un commentaire
Réponse
+0
moins plus
sur Solaris, toujours utiliser nawk (new awk)
il faut utiliser des opérateurs logiques, && pour AND, ¦¦ pour OR, ! pour NOT
$0 ~ _date && /Erreur/ { ...

/texte/ et $0 ~ /texte/ c'est la même chose, MAIS _date est une variable, Erreur est un texte
Ajouter un commentaire
Réponse
+0
moins plus
super ca fonctionne parfaitement , ouf !!!

Merci pour ton aide précieuse, je ne m'en sortais pas!!
Ajouter un commentaire
Réponse
+0
moins plus
bonnes fêtes, alors
Ajouter un commentaire
Ce document intitulé « [awk] et variables » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
5 extensions si vous voulez revenir à l'ancien Facebook