Elaborare dati in file con delimitatori multipli
Se vengono utilizzate le quadre per indicare i delimitatore, awk interpreta i delimitatori con una sorta di OR fra i delimitatori stessi; se le graffe non ci sono, awk interpreta i delimitatori come un unico delimitatore:
awk -F ‘[:;]’ -> è la sintassi per impostare delimitatori multipli (“:” OR “;”)
awk -F ‘;;;’ -> il delimitatore è “;;;” (“;;;”)
awk -F ‘[][]’ -> i delimitatori sono le parentesi quadre (“]” OR “[“)
# Il file ha due tipi di delimitatori, ":" e ";": $ cat file5 primo:2010:10;20;30 secondo:2011:12;29;19 terzo:2012:15;50;61 quarto:2013:10;55;113
# Fai la somma dei campi 3, 4 e 5: $ awk -F '[:;]' '{x=$3+$4+$5; print $1" anno: " $2" totale delle entrate: " x " EURO"}' file5 primo anno: 2010 totale delle entrate: 60 EURO secondo anno: 2011 totale delle entrate: 60 EURO terzo anno: 2012 totale delle entrate: 126 EURO quarto anno: 2013 totale delle entrate: 178 EURO
# Scompatta ogni record (linea) a seconda dei valori sulle colonne 3,4 e 5 $ awk -F '[;:]' '{for(i=3;i<=5;i++){print $1,$2,$i;}}' OFS=":" file5 primo:2010:10 primo:2010:20 primo:2010:30 secondo:2011:12 secondo:2011:29 secondo:2011:19 terzo:2012:15 terzo:2012:50 terzo:2012:61 quarto:2013:10 quarto:2013:55 quarto:2013:113
Crea un nuovo record per ogni valore di 3, 4 e 5. Il loop:
(i=3;i<=5;i++) -> produce per ogni record i valori 3, 4 e 5 assegnandoli alla variabile “i”, quindi stampa:
{print $1,$2,$i;} -> 1, 2, 3; 1, 2, 4; 1, 2, 5 per ogni record
# Il file ha le parentesi quadre come delimitatori: $ cat file6 primo;2010[10]20;30 secondo;2011[12]29;19 terzo;2012[15]50;61 quarto;2013[10]55;113
$ awk -F '[][]' '{print $2}' file6 10 12 15 10
# Delimitatori multipli con parentesi quadre $ awk -F '[][;]' '{print $2, $3, $4, $5}' OFS="-" file6 2010-10-20-30 2011-12-29-19 2012-15-50-61 2013-10-55-113
# Serie di delimitatori: $ cat file7 123;;;202;;;203 124;;;213;;;203 125;;;222;;;203
ERRORE:
$ awk -F'[;;;]’ ‘{print $2}’ file7
(nessun output)
awk ha interpretato -F'[;;;]’ come “;” OR “;” OR “;” quindi imposta solo un “;” come delimitatore. Restituisce di conseguenza la colonna vuota tra il primo e il secondo “;”. Se si vuol visualizzare la colonna con i valori 202, 213 e 222 occorre quindi richedere la colonna 4:
$ awk -F'[;;;]' '{print $4}' file7 202 213 222
# Per indicare con precisione il delimitatore ";;;" dobbiamo usare -F';;;': $ awk -F';;;' '{print $2}' file7 202 213 222
# Possiamo naturalmente utilizzare della parole come delimitatori: $ cat file8 2014Romacapodanno 2013Romanatale 2012Romapasqua 2011Romacarnevale
$ awk -F'Roma' '{print $1, $2}' file8 2014 capodanno 2013 natale 2012 pasqua 2011 carnevale
# Possiamo anche impostare più parole come delimitatori: $ cat file9 2014Romacapodanno 2013Napolinatale 2012Firenzepasqua 2011Romacarnevale
$ awk -F'Roma|Firenze|Napoli' '{print $2}' file8 capodanno natale pasqua carnevale
————————————