При использовании AWK я пытаюсь понять, почему несуществующее поле (поле после $NF
) не сравнивается с числовым нулем.
В приведенном ниже примере строка ввода имеет два поля, поэтому согласно спецификации $3
должно быть "неинициализированное значение" и сравнивать равным 0. Другими словами, $3 == 0
должно возвращать true, но, как вы можете видеть ниже, возвращает false:
$ echo '1 2' | awk '{ print($3 == 0 ? "t" : "f") }'
f
Оба "One True AWK" (версия 20121220) и GNU AWK (версия 4.2.1) ведут себя одинаково. Здесь вывод GNU AWK:
$ echo '1 2' | gawk '{ print($3 == 0 ? "t" : "f") }'
f
Согласно спецификации POSIX AWK, несуществующие поля, такие как $3
должны быть неинициализированными значениями:
Ссылки на несуществующие поля (то есть поля после $ NF) должны оцениваться неинициализированным значением.
Кроме того, сравнения типа ==
должны выполняться численно, если один операнд является числовым, а другой - неинициализированным значением:
Сравнения (с операторами "<", "<=", "! =", "==", "> и"> = "должны выполняться численно, если оба операнда являются числовыми, если они являются числовыми и другой имеет строковое значение, которое является числовой строкой, или если оно числовое, а другое имеет неинициализированное значение. В противном случае операнды должны быть преобразованы в строки по мере необходимости...
И, наконец, неинициализированное значение "числовое значение" должно быть равно нулю:
Неинициализированное значение должно иметь как числовое значение нуля, так и строковое значение пустой строки.
Сравните это с неинициализированной переменной, которая сравнивается с равным нулю:
$ awk 'BEGIN { print(x == 0 ? "t" : "f") }'
t
Итак, в нашем первом примере $3
должно быть неинициализированным значением, ==
должно сравнить его численно, а его числовое значение должно быть равно нулю. Следовательно, мне кажется, что $3 == 0? "t": "f"
$3 == 0? "t": "f"
должен выводить t
вместо f
.
Может ли кто-нибудь помочь мне понять, почему это не так, или помочь мне понять, как я неправильно читаю спецификацию?