GUIDA AD AWK, 08 – delimitatori multipli

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

————————————

INDICE

Lascia una risposta

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *

È possibile utilizzare questi tag ed attributi XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>