Successivo: Cambiare i campi, Precedente: Campi, Su: Leggere file [Contenuti][Indice]
Un numero di campo non è necessario che sia una costante. Nel linguaggio
awk
si può usare qualsiasi espressione dopo ‘$’ per far
riferimento a un campo. Il valore dell’espressione specifica il numero di
campo. Se il valore è una stringa, piuttosto che un numero, viene convertito
in un numero. Consideriamo questo esempio:
awk '{ print $NR }'
Ricordiamo che NR
è il numero dei record letti fino a questo punto: uno
nel primo record, due nel secondo, etc. Così quest’esempio stampa il primo
campo del primo record, il secondo campo del secondo record, e così via.
Per il ventesimo record, è stampato il campo numero 20; molto probabilmente il
record ha meno di 20 campi, perciò stampa una riga vuota.
Questo è un altro esempio sull’uso di espressioni come numeri di campo:
awk '{ print $(2*2) }' mail-list
awk
calcola l’espressione ‘(2*2)’ e usa il suo valore come
numero del campo da stampare. Qui ‘*’ rappresenta la
moltiplicazione, quindi l’espressione ‘2*2’ ha il valore quattro. Le
parentesi vengono usate affinché la moltiplicazione sia eseguita prima
dell’operazione ‘$’; sono necessarie ogni volta che c’è un operatore
binario21
nell’espressione del numero di campo. Questo esempio, dunque, stampa il
tipo di relazione (il quarto campo) per ogni riga del file
mail-list. (Tutti gli operatori di awk
sono elencati, in
ordine decrescente di precedenza, in
Precedenza degli operatori (Come si nidificano gli operatori).)
Se il numero di campo calcolato è zero, si ottiene l’intero record.
Quindi, ‘$(2-2)’ ha lo stesso valore di $0
. Numeri di campo
negativi non sono consentiti; tentare di far riferimento a uno di essi
normalmente fa terminare il programma. (Lo standard POSIX non chiarisce
cosa succede quando si fa riferimento a un numero di campo negativo.
gawk
avvisa di questo e fa terminare il programma. Altre
implementazioni di awk
possono comportarsi in modo diverso.)
Come accennato in Un’introduzione ai campi,
awk
memorizza il numero di campi del record corrente nella variabile
predefinita NF
(vedi la sezione Variabili predefinite). Quindi,
l’espressione $NF
non è una funzionalità speciale — è la diretta
conseguenza della valutazione di NF
e dell’uso di questo valore come
numero di campo.
A un operatore binario, come ‘*’ per la
moltiplicazione, servono due operandi. La distinzione è necessaria poiché
awk
ha anche operatori unari (un operando) e ternari (tre
operandi).
Successivo: Cambiare i campi, Precedente: Campi, Su: Leggere file [Contenuti][Indice]