Successivo: , Precedente: , Su: Leggere file   [Contenuti][Indice]


4.3 Numeri di campo variabili

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.


Note a piè di pagina

(21)

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: , Precedente: , Su: Leggere file   [Contenuti][Indice]