Здесь есть тонкость. Есть две переменные, OFMT
и CONVFMT
. Переменная OFMT
используется для управления тем, как числа преобразуются в строки в операторе print
, а переменная CONVFMT
используется для определения того, как числа в общем случае преобразуются в строки (вне оператора print
):
До стандарта POSIX awk использовал значение OFMT
для преобразования чисел в строки. OFMT
указывает формат вывода, который будет использоваться при печати чисел с print
. CONVFMT
был введен для того, чтобы отделить семантику преобразования от семантики печати. И CONVFMT
, и OFMT
имеют одно и то же значение по умолчанию: "%.6g"
. В подавляющем большинстве случаев старые программы awk не меняют своего поведения.
источник: Руководство по GNU awk
Более подробную информацию об этом рассуждении можно найти в secion обосновании стандарта awk POSIX .
в числовом значении в операторе печати:
$ awk 'BEGIN{print 1/3}'
0.333333
$ awk 'BEGIN{OFMT="%.20g"; print 1/3 }'
0.33333333333333331483
$ awk 'BEGIN{CONVFMT="%.20g"; print 1/3 }'
0.333333
переменная с числовым значением в выражении print:
$ awk 'BEGIN{a=1/3; print a}'
0.333333
$ awk 'BEGIN{OFMT="%.20g"; a=1/3; print a }'
0.33333333333333331483
$ awk 'BEGIN{CONVFMT="%.20g"; a=1/3; print a }'
0.333333
переменная с числовым значением, преобразованным в строку в выражении print:
$ awk 'BEGIN{a=1/3; a=a""; print a}'
0.333333
$ awk 'BEGIN{OFMT="%.20g"; a=1/3; a=a""; print a }'
0.333333
$ awk 'BEGIN{CONVFMT="%.20g"; a=1/3; a=a""; print a }'
0.33333333333333331483