Oggi parliamo di awk, un vero e proprio linguaggio di programmazione pensato per elaborare file di testo. Lo trovi su qualunque sistema Linux ed è uno strumento formidabile per estrarre, filtrare e riformattare dati. Qui vediamo le basi, con esempi semplici che poi puoi applicare a file molto più grossi.
Per gli esempi uso lista.txt, con nome, cognome ed età separati da tabulazioni:
printf 'Mario\tRossi\t30\nLuisa\tBianchi\t25\nAnna\tVerdi\t41\n' \
> lista.txt
Come ragiona awk
awk legge l’input una riga alla volta. Il programma è fatto di pattern e azioni. Il flusso è questo:
- un blocco BEGIN, eseguito una sola volta prima di leggere;
- il blocco principale, eseguito per ogni riga letta;
- un blocco END, eseguito una sola volta alla fine.
Dentro le azioni, $0 è la riga intera, $1 il primo campo, $2 il secondo e così via. I campi sono separati da spazi o tabulazioni.
Un primo programma
Mettiamo insieme i tre blocchi: stampo un’intestazione, poi ogni riga così com’è, e infine una riga di chiusura:
awk 'BEGIN{printf "nome\tcognome\tanni\n"} {print} \
END{printf "-----\n"}' lista.txt
L’output:
nome cognome anni
Mario Rossi 30
Luisa Bianchi 25
Anna Verdi 41
-----
Il programma in un file
Quando il programma cresce conviene metterlo in un file e richiamarlo con -f. Creiamo esempio.awk con lo stesso contenuto:
BEGIN { printf "nome\tcognome\tanni\n" }
{ print }
END { printf "-----\n" }
e lo lanciamo così:
awk -f esempio.awk lista.txt
Passare variabili
Con l’opzione -v si passa un valore dalla riga di comando al programma. Creiamo variabili.awk:
BEGIN { printf "ciao %s\n", nome }
e lo lanciamo valorizzando la variabile nome:
awk -v nome=Mario -f variabili.awk
Il risultato è la riga:
ciao Mario
Scegliere I campi
Per stampare solo nome e cognome, separati da una tabulazione:
awk '{print $1 "\t" $2}' lista.txt
Filtrare con un pattern
Un’espressione regolare fra barre funge da pattern: l’azione scatta solo sulle righe che la soddisfano. Se non metto l’azione, awk stampa la riga. Le righe che contengono una n:
awk '/n/' lista.txt
Contare
Le variabili in awk nascono da sole, a zero. Basta incrementarne una per ogni riga che corrisponde e stamparla nel blocco END:
awk '/n/{tot++} END{print tot}' lista.txt
Qui conta quante righe contengono una n.
Condizioni sui campi
Il pattern può anche essere una condizione. La funzione length restituisce la lunghezza di una stringa: stampo le righe in cui il cognome supera i cinque caratteri.
awk 'length($2)>5' lista.txt
In sintesi
- awk lavora per righe e per campi ($1, $2, …);
- BEGIN e END girano una volta sola, all’inizio e alla fine;
- -f carica il programma da un file, -v passa variabili;
- un pattern decide su quali righe agire;
- le variabili si usano senza dichiararle, ottime per i contatori.
Awk ha molto altro, ma già così sostituisce parecchi giri di grep, cut e sort. Provalo sui tuoi file.
Link e risorse
- il video su YouTube
- esempi e comandi della puntata su GitHub
- gawk, man page — il manuale di riferimento
- awk, specifica POSIX — il linguaggio standard
- AWK, Wikipedia — in italiano
Sostieni il canale
PER SOSTENERE IL CANALE BASTANO UN LIKE E UN’ISCRIZIONE!
questi link sono affiliati Amazon, acquistando i libri che ti consiglio sostieni il canale!
