Settare variabili in awk e scambiarle con la shell
# Per assegnare un valore ad una variabile utilizziamo l'opzione -v: $ echo 7 | awk -v var2=6 -v var3=5 '{print $0+var2+var3}' 18
# Per passare una variabile ad awk, utilizziamo una sintassi molto simile: # Esempio: $ x=7 $ echo 10 | awk -v val=$x '{print $0+val}' 17i
La variabile $x è stata passata alla variabile awk “val” e come tale può essere utilizzata da awk.
Un altro modo per ottenere lo stesso risultato:
$ echo 10 | awk '{print $0 " " val}' val=$y 10 9
Se vogliamo invece avere accesso in awk alle variabili d’ambiente (in questo caso “USER”), utilizziamo la speciale variabile “ENVIRON” con la sintassi seguente:
$ echo 10 | awk '{print $0,ENVIRON["USER"]}' OFS=, 10,luca
Se vogliamo quotare i campi di un file di testo:
$ echo -e "pippo\n \bpluto\n \bpaperino" pippo pluto paperino
$ echo -e "pippo\n \bpluto\n \bpaperino" | awk -v apice="'" '{print apice $0 apice }' 'pippo' 'pluto' 'paperino'
# Similmente a quanto visto prima: $ echo -e "pippo\n \bpluto\n \bpaperino" | awk '{print q $0 q}' q='"' "pippo" "pluto" "paperino"
Per passare una variabile da awk alla shell:
$ cat file7 pippo 50 pluto 100 paperino 150 minnie 200
$ b=`awk '/pippo/{print $2}' file7` $ echo $b 50
Per passare più variabili awk alla shell:
$ all=`awk '{if($1=="paperino") {first=$2; print "first="first}; if($1=="minnie") {second=$2; print "second="second}}' file7` $ echo $all first=150 second=200 $ eval $all $ echo $first 150 $ echo $second 200
Il comando è abbastanza autoesplicativo. Notare che il comando “eval” esegue i comandi contenuti all’interno della variabile. Nel nostro caso setta le variabili $first e $second
Forse si preferisce utilizzare il metodo “source”:
$ awk '{if($1=="paperino") {xxx=$2; print "xxx="xxx}; if($1=="minnie") {yyy=$2; print "yyy="yyy}}' file7 > container $ cat container xxx=150 yyy=200 $ echo $xxx
$ echo $yyy
$ source container $ echo $xxx 150 $ echo $yyy 200
————————————