Per dividere una stringa in un array awk
utilizziamo la funzione split()
:
awk '{split($0, a, ":")}'
# ^^ ^ ^^^
# | | |
# string | delimiter
# |
# array to store the pieces
Se non viene fornito alcun separatore, utilizza il FS
valore predefinito per lo spazio:
$ awk '{split($0, a); print a[2]}' <<< "a:b c:d e"
c:d
Possiamo dare un separatore, ad esempio :
:
$ awk '{split($0, a, ":"); print a[2]}' <<< "a:b c:d e"
b c
Ciò equivale a impostarlo tramite FS
:
$ awk -F: '{split($0, a); print a[1]}' <<< "a:b c:d e"
b c
In gawk puoi anche fornire il separatore come regexp:
$ awk '{split($0, a, ":*"); print a[2]}' <<< "a:::b c::d e" #note multiple :
b c
E anche vedere cosa era il delimitatore in ogni passaggio usando il suo quarto parametro:
$ awk '{split($0, a, ":*", sep); print a[2]; print sep[1]}' <<< "a:::b c::d e"
b c
:::
Citiamo la pagina man di GNU awk :
split (stringa, array [, fieldsep [, seps]])
Dividi la stringa in pezzi separati da FieldSep e archivia i pezzi nell'array e le stringhe del separatore nell'array di seps . Il primo pezzo viene archiviato array[1]
, il secondo pezzo array[2]
e così via. Il valore di stringa del terzo argomento, FieldPep , è una regexp che descrive dove dividere la stringa (così come FS può essere una regexp che descrive dove dividere i record di input). Se FieldP viene omesso, viene utilizzato il valore di FS . split()
restituisce il numero di elementi creati. seps è gawk
un'estensione, con seps[i]
la stringa di separazione traarray[i]
e array[i+1]
. Se fieldsep è un singolo spazio, allora entra in gioco seps[0]
qualsiasi spazio bianco iniziale e in qualsiasi spazio bianco finale seps[n]
, dove n è il valore di ritorno di split()
(cioè il numero di elementi nell'array).
OFS
, inserisci le virgole tra loro, facendoleprint
vedere come argomenti separati.