2016-08-01 6 views
7

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

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

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

+0

Я бы предположил, что он специфичен для реализации. Я ничего не видел в [spec] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html), который прямо утверждает, что переменные поля * не * очищены в блоке 'END' , – chepner

+0

Я не могу найти ссылку специально для этих полей, но многие другие переменные, например, «NR», указаны для того, чтобы иметь значение последней обработанной записи, поэтому было бы не сумасшедшим продлить это поле переменные. –

+1

Реализация специфична. См. Например, что в HP-UX '$ 0' пусто. [поведение END блока awk на HP-UX] (http://stackoverflow.com/q/29970249/1983854) – fedorqui

ответ

8

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

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

+0

Исправить. Как отметил @fedorqui в своем комментарии [HP-UX awk] (http://stackoverflow.com/questions/29970249/awks-end-block-behaviour-on-hp -ux), например, это тот, который не будет сохранить '$ 0' и т. д. в разделе' END'. Обходной путь для сценария OPs, который я бы хотел, чтобы кто-то с HP-UX тестировал, я ожидаю, будет 'awk '{print $ 3; last = $ 0} END {$ 0 = последний; print $ 1, $ 2} '' –

+0

@EdMorton, что было бы интересно проверить, так как мне любопытно посмотреть, будет ли' $ 0' также встроен в 'END'. В моем GNU awk это 'awk 'END {$ 0 =" a b c "; print $ 1} 'file', но это я не знаю, если это происходит во всех awk-вариантах. – fedorqui

+0

Это ** должно ** работать с тех пор, как POSIX говорит, что такие вещи, как «назначение в $ 0, делает бла-бла-бла», а не «присваивание $ 0 делает бла-бла-бла, кроме как сделано в разделе END», но я хотел бы получить подтверждение от тест с awk, который не сохраняет '$ 0' в разделе' END'. –

 Смежные вопросы

  • Нет связанных вопросов^_^