Подтвердить что ты не робот

Почему "1" в awk печатает текущую строку?

В этот ответ,

awk '$2=="no"{$3="N/A"}1' file

был принят. Обратите внимание на 1 в конце AWK script. В комментариях автор ответа сказал

[1] - загадочный способ отображения текущей строки.

Я озадачен. Как это работает?

4b9b3361

Ответ 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

Ответ 2

Документация говорит

В правиле 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, поскольку действие по умолчанию запускается только при столкновении с правилом без каких-либо действий.

Ответ 3

AWK работает над методом условия, а затем действием. Поэтому, если какое-либо условие TRUE, будет выполнено любое действие, которое мы упомянем, чтобы оно выполнялось.

В случае 1 это означает, что мы делаем это условие TRUE, и в этом случае мы не будем упоминать о каком-либо действии, поэтому awk по умолчанию будет выполняться действие print.

Итак, вот почему мы на самом деле пишем 1 в ярлыке.