Чтобы разбить строку на массив в 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
:::
Давайте процитируем справочную страницу GNU awk :
split (строка, массив [, fieldsep [, seps]])
Разделите строку на части, разделенные fieldsep и сохраните части в массив и разделительные строки в массиве seps . Первый кусок хранится в array[1]
, второй кусок в array[2]
и так далее. Строковое значение третьего аргумента, fieldsep , является регулярным выражением, описывающим, где разделить string (почти как FS может быть регулярным выражением, описывающим, где разделить входные записи ). Если fieldsep опущен, используется значение FS . split()
возвращает количество созданных элементов. seps - расширение gawk
, с seps[i]
- строка-разделитель между array[i]
и array[i+1]
. Если fieldsep представляет собой один пробел, то любой начальный пробел переходит в seps[0]
, а любой конечный пробел - в seps[n]
, где n - это возвращаемое значение split()
(т.е. , количество элементов в массиве).