Согласно руководству GNU awk, немного неясно, что $0
должно содержаться в правиле END. POSIX требует, чтобы NF
"сохранял [свое] значение" (*), но не упоминает $0
.
Вероятнее всего, по недосмотру в стандарте не сказано, что
$0
также сохраняется, хотя по логике можно было бы подумать, что так и должно быть. Фактически, все BWK awk, mawk и gawk сохраняют значение$0
для использования в правилахEND
. Имейте в виду, однако, что некоторые другие реализации и многие старые версии Unix awk этого не делают.
В некотором смысле я нахожу такое поведение логичным. Оставив $0
для блока END
, можно легко получить доступ к последней записи, если это необходимо. К первой записи легко получить доступ с помощью NR == 1 {...}
, поэтому специальное ключевое слово не требуется. С другой стороны, выполнение блоков BEGIN
перед загрузкой первой записи позволяет установить FS
или RS
вовремя, чтобы они стали активными для первой записи.
(* Что бы это ни значило, см. комментарии.)