Обычно вы используете предложения BEGIN
и END
в awk
, когда вам нужны определенные действия до и после фактической обработки файла соответственно. Таким образом, с этой логикой операторы/действия внутри них выполняются только один раз для данного входного файла.
Какие действия обычно выполняются в BEGIN
?
Инициализация специальных переменных для разделения строкового ввода, т. е. разделителей полей ввода и вывода FS
, OFS
. Хотя всегда можно определить эти специальные переменные с помощью конструкции -v FS=
или определить их с помощью оператора регулярного выражения -F','
, это гораздо более читабельно, когда это сделано таким образом. Из вашего примера необходимость определения { FS="," }
внутри тела awk
довольно избыточна, поскольку она инициализирует переменную для каждой строки вашего входного файла. Например,. если ваша строка содержит n строк, инициализация происходит n раз.
echo "1,2,3" | awk 'BEGIN {FS=OFS=","} {print $1}'
Определение пользовательской строки заголовка для вывода, сгенерированного из тела сценария awk
. Например,. из предыдущего примера я хотел бы распечатать заголовок, который говорит, что я распечатываю значения первого столбца
echo "1,2,3" | awk 'BEGIN {FS=OFS=","; print "First column values only"} {print $1}'
(Опционально -только для удобочитаемости)-Вы также можете инициализировать свои переменные, которые будут использоваться внутри тела программы. Хотя это и не рекомендуется, так как awk
динамически обрабатывает инициализацию переменных, было бы хорошо, если бы это было в BEGIN
для понимания состояния переменной
echo "1,2,3" | awk 'BEGIN {FS=OFS=","; counter = 0; } $1 == "1" { counter++ }'
Какие действия обычно выполняются в END
?
Отслеживание количества обработанных строк в теле команды awk
. Одной из общих идиом может быть отслеживание количества строк в файле. Мы используем специальную awk
переменную NR
, которая является текущим счетчиком, который увеличивается по мере обработки каждой строки. то есть.в первой строке значение переменной будет равно 1 и впоследствии будет увеличиваться. Но, учитывая это, как мы напечатаем общее количество строк в файле. Нельзя использовать print NR
в теле файла, так как будет напечатан номер текущей строки, поскольку awk
обрабатывает файл. Например. первый фрагмент ниже не будет работать. Итак, здесь появляется END
, поскольку операторы внутри него получают после завершения обработки файла. Таким образом, выполнение того же вывода в END
означает, что мы получаем последнее значение, хранящееся в NR
printf '1\n2\n\3' | awk '{print "total="NR}'
total=1
total=2
total=3
printf '1\n2\n\3' | awk 'END{print "total="NR}'
total=3
Как и в случае с предложением BEGIN
для вывода информации заголовка, вы можете печатать строки, информацию в виде сводки, поскольку к этому времени вся обработка вашего файла будет завершена.
Эта документация Эффективное программирование на AWK — лучший ресурс для лучшего знакомства с инструментом.
Цитаты в
atnr.isMember('d_group','d_user',true)
проблема:
atnr.isMember(d_group,d_user,true)