awk
Встроенные переменные
Поиск…
FS - полевой разделитель
Используется awk для разделения каждой записи на несколько полей:
echo "a-b-c
d-e-f" | awk 'BEGIN {FS="-"} {print $2}'
приведет к:
b
e
Переменная FS также может быть установлена с использованием опции -F :
echo "a-b-c
d-e-f" | awk -F '-' '{print $2}'
По умолчанию поля разделяются пробелами (пробелы и табуляции), а несколько пробелов и вкладок подсчитываются как один разделитель.
RS - записывающий разделитель
Используется awk для разделения ввода на несколько записей. Например:
echo "a b c|d e f" | awk 'BEGIN {RS="|"} {print $0}'
производит:
a b c
d e f
По умолчанию разделитель записи является символом новой строки.
Аналогично: echo "abc | de f" | awk 'BEGIN {RS = "|"} {print $ 2}'
производит:
b
e
OFS - выходной полевой разделитель
Используется awk для разделения полей, выводимых оператором print . Например:
echo "a b c
d e f" | awk 'BEGIN {OFS="-"} {print $2, $3}'
производит:
b-c
e-f
Значение по умолчанию , строка, состоящая из одного пробела.
ORS - выходной разделитель записи
Используется awk для разделения записей и выводится в конце каждого оператора print . Например:
echo "a b c
d e f" | awk 'BEGIN {ORS="|"} {print $2, $3}'
производит:
b c|e f
Значение по умолчанию - \n (символ новой строки).
ARGV, ARGC - массив аргументов командной строки
Аргументы командной строки, переданные awk, хранятся во внутреннем массиве ARGV элементов ARGC . Первым элементом массива является имя программы. Например:
awk 'BEGIN {
for (i = 0; i < ARGC; ++i) {
printf "ARGV[%d]=\"%s\"\n", i, ARGV[i]
}
}' arg1 arg2 arg3
производит:
ARGV[0]="awk"
ARGV[1]="arg1"
ARGV[2]="arg2"
ARGV[3]="arg3"
FS - полевой разделитель
Переменная FS используется для установки разделителя полей ввода . В awk пространство и вкладка действуют как разделители полей по умолчанию. Соответствующее значение поля можно получить через $1 , $2 , $3 ... и так далее.
awk -F'=' '{print $1}' file
-
-F- опция командной строки для установки разделителя полей ввода.
awk 'BEGIN { FS="=" } { print $1 }' file
OFS - выходной полевой разделитель
Эта переменная используется для установки разделителя выходных полей, который по умолчанию является пространством.
awk -F'=' 'BEGIN { OFS=":" } { print $1 }' file
Пример:
$ cat file.csv
col1,col2,col3,col4
col1,col2,col3
col1,col2
col1
col1,col2,col3,col4,col5
$ awk -F',' 'BEGIN { OFS="|" } { $1=$1 } 1' file.csv
col1|col2|col3|col4
col1|col2|col3
col1|col2
col1
col1|col2|col3|col4|col5
Присвоение $1 к $1 в $1=$1 изменяет поле (в этом случае $1 ), и это приводит к awk восстанавливающему запись $0 . Восстановление записи заменяет разделители FS на OFS .
RS - входной разделитель записи
Эта переменная используется для установки разделителя входных записей, по умолчанию - новой строки.
awk 'BEGIN{RS=","} {print $0}' file
ORS - выходной разделитель записи
Эта переменная используется для установки разделителя выходной записи, по умолчанию - новой строки.
awk 'BEGIN{ORS=","} {print $0}' file
NF - количество полей
Эта переменная даст вам общее количество полей в текущей входной записи.
awk -F',' '{print NF}' file.csv
Пример:
$ cat file.csv
col1,col2,col3,col4
col1,col2,col3
col1,col2
col1
col1,col2,col3,col4,col5
$ awk -F',' '{print NF}' file.csv
4
3
2
1
5
NR - общее количество записей
Будет предоставлено общее количество записей, обработанных в текущем экземпляре awk .
cat > file1
suicidesquad
harley quinn
joker
deadshot
cat > file2
avengers
ironman
captainamerica
hulk
awk '{print NR}' file1 file2
1
2
3
4
5
6
7
8
В этом экземпляре было обработано всего 8 записей.
FNR - количество записей в файле
Предоставляет общее количество записей, обрабатываемых экземпляром awk относительно файлов awk , обрабатывает
cat > file1
suicidesquad
harley quinn
joker
deadshot
cat > file2
avengers
ironman
captainamerica
hulk
awk '{print FNR}' file1 file2
1
2
3
4
1
2
3
4
Каждый файл имел по 4 строки каждый, поэтому всякий раз, когда awk сталкивался, EOF FNR был сброшен на 0.
NF - количество полей
Предоставляет количество столбцов или полей в каждой записи (запись соответствует каждой строке). Каждая строка демаркируется RS которая по умолчанию соответствует новой строке.
cat > file1
Harley Quinn Loves Joker
Batman Loves Wonder Woman
Superman is not dead
Why is everything I type four fielded!?
awk '{print NF}' file1
4
4
4
7
FS (где-то там) по умолчанию используется вкладка или пробел. Так что Harley, Quinn, Loves, Joker считаются столбцами. Случай имеет место для следующих двух строк, но последняя строка содержит 7 пробелов, что означает 7 столбцов.
FNR - обрабатываемый текущий номер записи
FNR содержит номер обрабатываемой строки входного файла. В этом примере вы увидите awk, начиная с 1, когда начнете обрабатывать второй файл.
Пример с одним файлом
$ cat file1
AAAA
BBBB
CCCC
$ awk '{ print FNR }' file1
1
2
3
Пример с двумя файлами
$ cat file1
AAAA
BBBB
CCCC
$ cat file2
WWWW
XXXX
YYYY
ZZZZ
$ awk '{ print FNR, FILENAME, $0 }' file1 file2
1 file1 AAAA
2 file1 BBBB
3 file1 CCCC
1 file2 WWWW
2 file2 XXXX
3 file2 YYYY
4 file2 ZZZZ
Расширенный пример с двумя файлами
FNR может использоваться для определения того, обрабатывает ли awk первый файл, поскольку NR==FNR является истинным только для первого файла. Например, если мы хотим объединить записи из файлов file1 и file2 в их FNR :
$ awk 'NR==FNR { a[FNR]=$0; next } (FNR in a) { print FNR, a[FNR], $1 }' file1 file2
1 AAAA WWWW
2 BBBB XXXX
3 CCCC YYYY
Запись ZZZZ из file2 отсутствует, поскольку FNR имеет другое максимальное значение для file1 и file2 и нет соединения для разных FNR .