Aby podzielić ciąg na tablicę awk
, używamy funkcji split()
:
awk '{split($0, a, ":")}'
# ^^ ^ ^^^
# | | |
# string | delimiter
# |
# array to store the pieces
Jeśli nie podano separatora, używa znaku FS
, który domyślnie jest spacją:
$ awk '{split($0, a); print a[2]}' <<< "a:b c:d e"
c:d
Możemy podać separator, na przykład :
:
$ awk '{split($0, a, ":"); print a[2]}' <<< "a:b c:d e"
b c
Co jest równoważne ustawieniu go przez FS
:
$ awk -F: '{split($0, a); print a[1]}' <<< "a:b c:d e"
b c
W gawk możesz także podać separator jako wyrażenie regularne:
$ awk '{split($0, a, ":*"); print a[2]}' <<< "a:::b c::d e" #note multiple :
b c
A nawet zobacz, jaki separator znajdował się na każdym kroku, używając jego czwartego parametru:
$ awk '{split($0, a, ":*", sep); print a[2]; print sep[1]}' <<< "a:::b c::d e"
b c
:::
Zacytujmy stronę podręcznika systemowego GNU awk :
split (string, array [, fieldsep [, seps]])
Podziel ciąg na części oddzielone sepami pól i zapisz je w tablicy, a ciągi separatorów w tablicy seps . Pierwsza część jest przechowywana array[1]
, druga część array[2]
i tak dalej. Wartość ciągu trzeciego argumentu, sep-pól , jest wyrażeniem regularnym opisującym, gdzie podzielić łańcuch (podobnie jak FS może być wyrażeniem regularnym opisującym, gdzie podzielić rekordy wejściowe). Jeśli pominięto sep-pól , używana jest wartość FS . split()
zwraca liczbę utworzonych elementów. seps to agawk
rozszerzenie, które seps[i]
jest łańcuchem oddzielającym pomiędzyarray[i]
i array[i+1]
. Jeśli sep-pól jest pojedynczą spacją, to wszelkie początkowe białe spacje trafiają do, seps[0]
a wszystkie końcowe spacje przechodzą do seps[n]
, gdzie n jest wartością zwracaną split()
(tj. Liczbą elementów w tablicy).
OFS
, wstaw przecinki między nimi, abyprint
zobaczyć je jako oddzielne argumenty.