Чтобы разбить строку на массив, awk
мы используем функцию split()
:
awk '{split($0, a, ":")}'
# ^^ ^ ^^^
# | | |
# string | delimiter
# |
# array to store the pieces
Если разделитель не указан, используется значение по FS
умолчанию, равное пробелу:
$ awk '{split($0, a); print a[2]}' <<< "a:b c:d e"
c:d
Мы можем дать разделитель, например :
:
$ awk '{split($0, a, ":"); print a[2]}' <<< "a:b c:d e"
b c
Что эквивалентно установке через FS
:
$ awk -F: '{split($0, a); print a[1]}' <<< "a:b c:d e"
b c
В gawk вы также можете указать разделитель как регулярное выражение:
$ awk '{split($0, a, ":*"); print a[2]}' <<< "a:::b c::d e" #note multiple :
b c
И даже посмотрите, какой разделитель был на каждом шаге, используя его четвертый параметр:
$ awk '{split($0, a, ":*", sep); print a[2]; print sep[1]}' <<< "a:::b c::d e"
b c
:::
Давайте процитируем man-страницу GNU awk :
split (строка, массив [, fieldsep [, seps]])
Разделите строку на части, разделенные fieldsep, и сохраните части в массиве и строки-разделители в массиве seps . Первый кусок хранится в array[1]
, второй кусок в array[2]
и так далее. Строковое значение третьего аргумента, fieldsep , является регулярным выражением, описывающим, где разбивать строку (так же, как FS может быть регулярным выражением, описывающим, где разбивать входные записи). Если fieldsep опущен, используется значение FS . split()
возвращает количество созданных элементов. seps - это gawk
расширение с seps[i]
разделительной строкой междуarray[i]
и array[i+1]
. Если fieldsep является одним пробелом, то любой начальный пробел входит в seps[0]
и любой конечный пробел входит в seps[n]
, где n - возвращаемое значение split()
(то есть, количество элементов в массиве).
OFS
, вставьте между ними запятые, чтобы ониprint
рассматривались как отдельные аргументы.