In questa sezione saranno presentati dei brevi script nel liguaggio AWK. Nonostante siano molto semplici, possono essere utili per capire la logica che guida questo linguaggio di scripting, un po diversa da linguaggi di programmazione pi� noti. Per avere informazioni di carattere generale su AWK, potete leggere la
Voce AWK su Wikipedia.
AWK � un linguaggio interpretato volto alla processazione di file di testo. Per l'interprete, un file di testo � una grande tabella. Ciascuna riga del testo � una riga della tabella (detta record). Ciascuna parola circondata da spazi � una colonna di tale tabella, detta field (o campo). Quando un file di testo viene dato in ingresso a uno script AWK, succede quanto segue:
- L'interprete AWK apre automaticamente il file.
- L'interprete AWK scorre tutti i record (righe) del file di testo, e applica le regole di modifica indicate dai comandi AWK. Sottolineiamo che il file viene scorso automaticamente, il programmatore non deve implementare nessun ciclo for, while, foreach.
- L'interprete AWK salva il file e lo chiude.
Come si pu� intuire, � possibile processare grandi quantit� di dati scrivendo semplici regole, risparmiando il tempo necessario a implementare operazioni come l'apertura e chiusura dei file, o la lettura e scrittura di righe.
Altra grande semplificazione di AWK � l'assenza di variabili tipizzate: ciascuna variabile pu� essere indifferentemente trattata come testo o numero.
La struttura di un comando AWR per processare un record �:
(condizione) {azione}
- Condizione rappresenta una condizione che individua un record o una porzione di record sul quale si desidera agire.
- Azione rappresenta l'azione da eseguire sul record o porzione di record scelto.
Nei successivi file di esempio faremo sempre riferimento a un file di testo contenente l'elenco delle nazioni con superficie, popolazione, continente:
USSR 86250 262 Asia
USA 3615 219 Nord America
China 3692 866 Asia
Canada 3852 24 Nord America
Brazil 3286 116 South America
Australia 2968 14 Oceania
India 1269 637 Asia
Argentina 1072 26 South America
Sudan 968 19 Africa
Italy 920 60 Europe
Angola 1246 12 Africa
Austria 83 8 Europe
Spain 504 45 Europe
Selezionare i campi
Questo esempio mostra come vengono identificati i campi di ciascun record: tramite numeri preceduti dal $ (proprio come avviene per i parametri passati dalla riga di comando nella Bash).
#!/usr/bin/awk -f
# Questo script stampa solo nazioni e continenti
{print $1, $4}
Condizioni e variabili
Questi esempi mostrano come sia possibile inserire condizioni di carattere numerico e che fanno uso di funzioni complesse. Notiamo come non esista tipizzazione in AWK: la stringa letta, se rappresenta un numero, pu� essere automaticamente convertita e usata come numero.
#!/usr/bin/awk -f
# Questo script stampa tutti i dati relativi solo alle
# nazioni con pi� di 50 milioni di persone.
( $3 > 50 ) { print $0 }
#!/usr/bin/awk -f
# Questo script stampa tutti i dati relativi solo alle
# nazioni il cui nome � pi� lungo di 5 caratteri
( length($1)>=5 ) { print $0 }
Espressioni regolari
Questi esempi mostrano come sia possibile implementare le espressioni regolai in AWK. Da notare la presenza delle barre / per delimitare l'espressione regolare, e la presenza della ˜ per riferire l'espressione regolare a un solo campo anzich� a tutto il record.
#!/usr/bin/awk -f
# Questo script stampa tutti i dati relativi solo alle
# nazioni asiatiche
(/.Asia/) {print $0}
#!/usr/bin/awk -f
# Questo script stampa tutti i dati relativi solo alle
# nazioni europee
( /Europe/) { print $0 }
#!/usr/bin/awk -f
# Questo script stampa tutti i dati relativi solo alle
# nazioni inizianti per A
( $1~/A./ ) { print $0 }
Condizioni composte
Nei seguenti esempi possiamo vedere come sia possibile combinare pi� condizioni tramite degli operatori booleani del tutto simili a quelli implementati nel linguaggio C.
#!/usr/bin/awk -f
# Questo script stampa tutti i dati relativi solo alle
# nazioni con pi� di 50 milioni di persone e una
# superficie di pi� di 2 milioni di km quadrati
( $3 > 50 && $2 > 2000) { print $0 }
#!/usr/bin/awk -f
# Questo script stampa tutti i dati relativi solo alle
# nazioni africane che iniziano per A
( $0~/Africa/ && $1~/^A/ ) { print $0 }
#!/usr/bin/awk -f
# Questo script stampa tutti i dati relativi solo alle
# nazioni europee il cui nome inzia per A o S
( $0~/Europe/ && ($1~/^A/ || $1~/^S/) ) { print $0 }