Определены ли поля в блоке END в AWK?

Что произойдет при использовании $1, $2 ... в блоке END, например:

awk '{print $3}END{print $1 $2}'

Я обнаружил, что $1 и $2 сохраняют значения из последней записи. Гарантируется ли такое поведение стандартом или зависит от реализации?


person Mosty Amine    schedule 01.08.2016    source источник
comment
Я бы предположил, что это зависит от реализации. Я не нашел ничего в спецификации, в котором прямо говорится, что переменные поля не очищаются в блоке END.   -  person chepner    schedule 01.08.2016
comment
Я не могу найти ссылку конкретно на эти поля, но многие другие переменные, такие как, например, NR, указаны для значения последней обработанной записи, поэтому было бы не безумием распространить это на переменные поля .   -  person Eric Renouf    schedule 01.08.2016
comment
Это зависит от реализации. См. Например, что в HP-UX $0 пусто. Поведение блока END в awk в HP-UX   -  person fedorqui 'SO stop harming'    schedule 01.08.2016


Ответы (1)


Проверка документов мы видим, что это зависит от реализации:

Традиционно, в основном из-за проблем с реализацией, $ 0 и NF не были определены внутри правила END. Стандарт POSIX определяет, что NF доступен в правиле END. Он содержит количество полей из последней входной записи. Скорее всего, по недосмотру стандарт не говорит, что $ 0 также сохраняется, хотя логически можно было бы подумать, что так и должно быть. Фактически, все BWK awk, mawk и gawk сохраняют значение $ 0 для использования в правилах END. Однако имейте в виду, что некоторые другие реализации и многие старые версии Unix awk не поддерживают.

person Juan Diego Godoy Robles    schedule 01.08.2016
comment
Верный. Как отметил @fedorqui в своем комментарии HP-UX awk, для Например, это тот, который не будет сохранять $0 и т. д. в разделе END. Обходной путь для сценария OPs, который я бы хотел, чтобы кто-нибудь с HP-UX протестировал, будет, как я полагаю, awk '{print $3; last=$0} END{$0=last; print $1, $2}' - person Ed Morton; 01.08.2016
comment
@EdMorton, это было бы интересно проверить, так как мне любопытно узнать, будет ли $0 встроен в END. В моем GNU awk это происходит awk 'END {$0="a b c"; print $1}' file, но я не знаю, встречается ли это во всех разновидностях awk. - person fedorqui 'SO stop harming'; 01.08.2016
comment
Он должен работать, поскольку POSIX говорит что-то вроде assignment to $0 does blah blah blah, а не assignment to $0 does blah blah blah except when done in the END section, но я хотел бы получить подтверждение от теста с awk, который не сохраняет $0 в разделе END. - person Ed Morton; 01.08.2016