Поиск…


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 .



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow