Aby podzielić ciąg do tablicy w awk
używamy funkcji split()
:
awk '{split($0, a, ":")}'
# ^^^^^^
# | | |
# string | delimiter
# |
# array to store the pieces
Jeśli nie separator podano , używa parametru FS
, który domyślnie jest przestrzenią:
$ awk '{split($0, a); print a[2]}' <<< "a:b c:d e"
c:d
Możemy dać 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żna również separator jako wyrazy regularne:
$ awk '{split($0, a, ":*"); print a[2]}' <<< "a:::b c::d e" #note multiple :
b c
a nawet zobaczyć co separator był na każdym kroku za pomocą czwarty parametr:
$ awk '{split($0, a, ":*", sep); print a[2]; print sep[1]}' <<< "a:::b c::d e"
b c
:::
Zacytujmy stronę man:
split (łańcuch, tablica [, sep-pól [, SEPS]])
Podziel ciąg na części oddzielone spacerem i zapisz kawałki w tablicy i ciągi separatorów w tablicy seps. Pierwszy element jest przechowywany w tablicy 1, drugim elemencie w tablicy [2] i tak dalej. Wartość ciągu trzeciego argumentu, fieldsep, to wyrażenie regularne opisujące gdzie można podzielić ciąg znaków (tak jak FS może być wyrażeniem regularnym opisującym, gdzie podzielić rekordy wejściowe). Jeśli pominięto argument fieldsep, używana jest wartość FS. split() zwraca liczbę utworzonych elementów. seps jest rozszerzeniem gawk , z seps [i] będącym łańcuchem separatora między tablicą [i] a tablicą [i + 1]. Jeśli separator pól to pojedyncza spacja, to każda z białych spacji przechodzi w seps [0], a wszelkie końcowe białe znaki przechodzą w seps [n], gdzie n jest wartością zwracaną przez split() (tj. Liczbę elementów w tablicy).
Zauważ, że twoje dane wyjściowe łączą elementy tablicy bez separatora. Jeśli zamiast tego chcesz je oddzielić za pomocą 'OFS', umieść przecinki między nimi, dzięki czemu' print' zobaczy je jako oddzielne argumenty. – dubiousjim