Newsgroup: it.comp.os.linux.sys
Titolo: awk e variabili bash

Ho spulciato un po' il man awk ma non capisco lo stesso...
come posso assegnare a variabili d'ambiente generali i valor di $1 e $2 che
mi trova awk per esempio dividendo in due una linea?
ho provato con 
awk -F ":" '{ENVIRON["AA"]=$2}' -|echo $AA
però non funge...l'echo non stampa il contenuto originario di $2
-- 
Vide
echo '[q]sa[ln0=aln256%Pln256/snlbx]sb3135071790101768542287578439snlbxq'|dc

 writes:
V> Ho spulciato un po' il man awk ma non capisco lo stesso...  come
V> posso assegnare a variabili d'ambiente generali i valor di $1 e $2
V> che mi trova awk per esempio dividendo in due una linea?  ho
V> provato con
V> awk -F ":" '{ENVIRON["AA"]=$2}' -|echo $AA
V> però non funge...l'echo non stampa il contenuto originario di $2
ENVIRON     An array containing the values of the current environment.
            The  array  is  indexed by the environment variables, each
            element being the value  of  that  variable  (e.g.,  ENVI-
            RON["HOME"]  might  be /home/arnold).  Changing this array #
            does not affect the environment  seen  by  programs  which #
            gawk spawns via redirection or the system() function.      #
(Cambiare questo array non influisce sull'ambiente visto dai programmi
 che gawk lancia via redirezione o con la funzione system())
Secondo: $n è un parametro, non una variabile di ambiente.
-- 
 /\           ___
/___/\_|_|\_|__|___Gian Uberto Lauri_____
  //--\| | \|  |   Integralista GNUslamico
\/                 e coltivatore diretto di Software

 Secondo: $n è un parametro, non una variabile di ambiente.
E mica ho detto che lo siano, io però ho i due parametri $1 e $2 in awk,
risultato della divisione della linea che gli ho dato in pasto, e voglio
assegnare questi due valori a due variabili d'ambiente esterne a awk per
poter utilizzare comodamente questi due valori nel ciclo for che sto
facendo. Dove devo guardare?


 facendo. Dove devo guardare?
Se il modulo AWK ti stampa il risultato su stdout, allora e` facile...
Oppure in un file o su un pipe, ma e` una complicazione inutile.
Ciao,
-- 
        Roberto Divia`              Love at first sight is one of the greatest
Dep:PH Bat:53 Mailbox:C02110      labour-saving devices the world has ever seen
Route de Meyrin 385               ---------------------------------------------
Case Postale                                Phone:  
+41-22-767-4994
CH-1211 Geneve 23 CERN                      Fax:    
+41-22-767-9585
Switzerland                                 E-Mail: 
Robert...@cern.ch

> Secondo: $n è un parametro, non una variabile di ambiente.
V> E mica ho detto che lo siano,
Vero, ho letto male io. Sorry.
V> io però ho i due parametri $1 e $2 in
V> awk, risultato della divisione della linea che gli ho dato in
V> pasto, e voglio assegnare questi due valori a due variabili
V> d'ambiente esterne a awk per poter utilizzare comodamente questi
V> due valori nel ciclo for che sto facendo. Dove devo guardare?
man bash, cerca "backquote" :)


 valor di $1 e $2 ...
BB=`echo $AA | cut -d: -f2`
CC=`echo $AA | awk -F: '{print $2}'`

 CC=`echo $AA | awk -F: '{print $2}'`
ALT! c'è stato un malinteso. i backquotes o $() li conosco benissimo, però
quello che voglio è che awk mi ritorni ENTRAMBI i valori $1 e $2 nello
stesso esatto momento. Provo a spiegarmi con un esempio.
$ echo "aaaaDIVbbbb" > pippo
$ cat pippo | awk -F "DIV" '{print $1"--"$2}' -
aaaa--bbbbb
fin qui ci siamo?
ora io voglio che $1 ("aaaa") e $2 ("bbbb") da awk vadano a DUE variabili
d'ambiente nello stesso colpo, qualcosa tipo (me lo invento e non funziona
assolutamente)
$ cat pippo | awk -F "DIV" '{system("AA="$1";BB="$2}' -
$ echo $AA
aaaa
$ echo $BB
bbbb
così non dà errori però dopo i due echo non funzionano, perchè evidentemente
system() chiama un altro ambiente e $AA e $BB rimangono lì e non nella mia
bash originale.
Got it?


> CC=`echo $AA | awk -F: '{print $2}'`
V> ALT! c'è stato un malinteso. i backquotes o $() li conosco
V> benissimo, però quello che voglio è che awk mi ritorni ENTRAMBI i
V> valori $1 e $2 nello stesso esatto momento. Provo a spiegarmi con
V> un esempio.
Con UNA SOLA riga funziona
set `comando`
che ti mette in $1..$n la prima, seconda... ennesima parola nell'output
di comando. Ma funziona con una sola riga di output...
Altrimenti  devi  concatenare  gli  elementi  di ogni  coppia  con  un
separatore che la  shell non consideri tale, poi fare  un loop su tale
elenco (che for considererà elementi distinti), quindi splittare ogni
singolo elemento all'interno del loop.


 set `comando`
Ecco, questo funziona...però appunto con una sola riga...per cui alla fine
ho optato per un'altra soluzione...un po' meno elegante però funziona.
Grazie a tutti lo stesso :)


 Ecco, questo funziona...però appunto con una sola riga...
hai qualcosa contro
set `comando | tr '\n' ' '`
(ove il tr mette tutto l'output su una sola riga)?
-- 
  Maurizio Loreti    
ROT13:ybe...@cq.vasa.vg
    |  (@_
Un. of Padova, Dept. of Physics, Padova, Italy  |  //\
 
http://www.pd.infn.it/~loreti/mlo.html
      |  V_/_

 (ove il tr mette tutto l'output su una sola riga)?
Sì, anche questa è una soluzione ma ormai l'ho già implementato diversamente
(alla fin fine è solo un if in più)


 ...
Scusa la domanda, tanto per curiosita, visto che 
ormai hai gia` risolto ma cosa cambia se invochi 
awk una o due volte?
Hai qualche vincolo esterno?

 d'ambiente nello stesso colpo
$ read AA BB <<EOF
`cat pippo | awk -F "DIV" '{print $1" "$2}'`
EOF


 awk una o due volte?
No, il problema è che avevo una lista di file lunga da cui volevo
estrapolare una riga, e in questa riga c'erano due parti che mi servivano
nello stesso momento (il nome file che ti sputa grep e una parte della
stringa che tiro fuori con awk). Ma la riga in questione non era presente
in tutti i file nella stessa directory. Per cui volevo fare un grep $LINEA
*|awk blabla e avere indietro due variabili con la lista (separata per
spazi) di tutte le due stringhe di cui avevo bisogno.


 e una parte della stringa che tiro fuori  con awk)...
UN MOMENTO! MARCIA INDIETRO!
awk ha le stesse capacita` di grep
esempio:
awk '/regexp/ {print FILENAME":" $0}' *.txt
produce lo stesso output di:
grep regexp *.txt
Secondo me stai sbagliando qualcosa.

 Applicazione:
Mmmh, che pirla che sono, effettivamente avrei potuto mettere l'output di
grep in una variabile e poi utilizzando set(awk) dentro al for evitarmi
l'if.
Vabbè fa lo stesso, anche l'altro hack funziona ed è uno script che ha da
fare 3 cose in croce. :P
