Чтобы разбить строку на массив, 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рассматривались как отдельные аргументы.