Per dividere una stringa in un array in awk
si usa la funzione split()
:
awk '{split($0, a, ":")}'
# ^^^^^^
# | | |
# string | delimiter
# |
# array to store the pieces
Se non viene dato alcun separatore utilizza lo FS
, che per impostazione predefinita è lo spazio:
$ awk '{split($0, a); print a[2]}' <<< "a:b c:d e"
c:d
Siamo in grado di dare un separatore, ad esempio :
:
$ awk '{split($0, a, ":"); print a[2]}' <<< "a:b c:d e"
b c
che equivale a impostare attraverso il FS
:
$ awk -F: '{split($0, a); print a[1]}' <<< "a:b c:d e"
b c
In gawk si può 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 ciò che il delimitatore era su ogni passo utilizzando 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:
split (string, array [, fieldsep [, seps]]
Dividere la stringa in pezzi separati da fieldsep e memorizzare i pezzi nella matrice e le stringhe di separazione nell'array seps. Il primo pezzo viene memorizzato nell'array 1, il secondo pezzo nell'array [2] e così via. Il valore di stringa del terzo argomento, fieldsep, è un'espressione regolare che descrive in cui dividere la stringa (analogamente a quanto può essere una espressione regolare di FS in cui si trovano i record di input suddivisi in ). Se fieldep è omesso, viene utilizzato il valore di FS. split() restituisce il numero di elementi creati. seps è un'estensione gawk , con seps [i] è la stringa di separazione tra array [i] e array [i + 1]. Se fieldep è un singolo spazio, qualsiasi spazio bianco iniziale su va a seps [0] e qualsiasi spazio bianco finale va a seps [n], dove n è il valore di ritorno di split() (cioè il numero di elementi nella matrice).
Si noti che l'output concatena gli elementi dell'array, senza separatore. Se invece volessi che fossero separati con 'OFS', rimuovi le virgole tra di loro, facendo in modo che' print' li veda come argomenti separati. – dubiousjim