В этот ответ,
awk '$2=="no"{$3="N/A"}1' file
был принят. Обратите внимание на 1
в конце AWK script. В комментариях автор ответа сказал
[1] - загадочный способ отображения текущей строки.
Я озадачен. Как это работает?
В этот ответ,
awk '$2=="no"{$3="N/A"}1' file
был принят. Обратите внимание на 1
в конце AWK script. В комментариях автор ответа сказал
[1] - загадочный способ отображения текущей строки.
Я озадачен. Как это работает?
В awk
,
Так как 1
всегда принимает значение true, он выполняет операцию по умолчанию {print $0}
, поэтому печатает текущую строку, хранящуюся в $0
Итак, awk '$2=="no"{$3="N/A"}1' file
эквивалентно и сокращению
awk '$2=="no"{$3="N/A"} {print $0}' file
Снова $0
используется аргумент по умолчанию для печати, поэтому вы также можете написать
awk '$2=="no"{$3="N/A"} {print}' file
Фактически вы также можете использовать любое ненулевое число или любое условие, которое всегда оценивается как true вместо 1
Документация говорит
В правиле awk либо шаблон, либо действие могут быть опущены, но не оба. Если шаблон опущен, действие выполняется для каждой строки ввода. Если действие опущено, действие по умолчанию состоит в том, чтобы напечатать все строки, соответствующие шаблону.
Итак, он рассматривает 1
как шаблон без действия. Действие по умолчанию - это печать строки.
Даже если у вас есть несколько правил, например,
awk '
in_net {
if (/^\s+bindIp:/) {
print " bindIp: 0.0.0.0"
next
} else if (/^\s*(#.*)?$/) {
in_net = 0
}
}
/^net:/ {
in_net = 1
}
1
' /etc/mongod.conf
Вам все еще нужно 1
, поскольку действие по умолчанию запускается только при столкновении с правилом без каких-либо действий.
AWK работает над методом условия, а затем действием. Поэтому, если какое-либо условие TRUE, будет выполнено любое действие, которое мы упомянем, чтобы оно выполнялось.
В случае 1
это означает, что мы делаем это условие TRUE, и в этом случае мы не будем упоминать о каком-либо действии, поэтому awk по умолчанию будет выполняться действие print
.
Итак, вот почему мы на самом деле пишем 1 в ярлыке.