Я не вижу упоминания об этом в руководстве по GNU awk, но, например. справочная страница для функции printf()
в glibc упоминает о %g
, что:
Trailing zeros are removed from the fractional part of the result; a decimal point appears only if it is followed by at least one digit.
Кроме того, есть модификатор #
для «альтернативного формата», который говорит:
For g and G conversions, trailing zeros are not removed from the result as they would otherwise be.
Кроме того, %g
автоматически изменяется на формат 1.23e+3
по мере необходимости, а в поле точность (число после точки )является «максимальным числом значащих цифры для преобразований g и G"(не цифры после запятой ), поэтому мы получаем:
printf "%#.1g\n", 0 0.
printf "%#.2g\n", 0 0.0
printf "%#.2g\n", 12 12.
printf "%#.2g\n", 1234 1.2e+03
Таким образом, хотя вы можете принудительно отображать десятичную точку, вы не можете принудительно отображать нуль в конце.
Альтернативой может быть использование %f
вместо:
printf "%.1f\n", 0 0.0
printf "%.1f\n", 1234 1234.0
Или добавить отсутствующий ноль после точки при необходимости:
a = sprintf("%#.1g", 0); if (substr(a, length(a)) == ".") a = a "0";
Прямо:
$ awk '{ for (i=2;i<=NF;i++) if ($i=="NA") c++; print c; c=0 }' file
5
5
6