Как контролировать формат чисел с плавающей точкой в ​​gawk? - PullRequest
0 голосов
/ 03 октября 2019

Следующие два прогона отличаются. Как сделать первый запуск таким же, как и второй (я все еще хочу print без каких-либо явных аргументов)? Есть ли способ контролировать количество цифр в $1 = 1/3?

$ gawk -v OFMT='%.20g' -e 'BEGIN { $1 = 1/3; print }'
0.333333
$ gawk -v OFMT='%.20g' -e 'BEGIN { print 1/3}'
0.33333333333333331483

РЕДАКТИРОВАТЬ: следующее сравнение также неожиданно. В идеале, если есть только одно поле, print $1 и print должны быть одинаковыми. Я думаю, это можно считать ошибкой?

$ gawk -v OFMT='%.20g' -e 'BEGIN { $1 = 1/3; print $1}'
0.33333333333333331483
$ gawk -v OFMT='%.20g' -e 'BEGIN { $1 = 1/3; print}'
0.333333

Ответы [ 2 ]

4 голосов
/ 04 октября 2019

Здесь есть тонкость. Есть две переменные, 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
0 голосов
/ 03 октября 2019

Я не уверен, если это ошибка, но попробуйте установить переменную, а не первое поле

gawk -v OFMT='%.20g' -e 'BEGIN { a = 1/3; print a}'
0.33333333333333331483
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...