У меня есть простой файл с некоторыми числовыми значениями:
2018-11-15 14:07:22 37.672 20.553 15.90 4.0
2018-11-17 09:15:46 37.519 20.692 13.80 4.0
2018-11-17 20:33:18 37.540 21.712 9.50 4.2
2018-11-18 05:18:02 37.391 20.516 0.00 4.3
2018-11-18 06:06:44 37.556 20.268 0.00 4.3
2018-11-19 05:56:51 37.565 20.678 14.60 4.2
2018-11-19 13:05:56 37.179 20.580 6.10 5.1
2018-11-19 16:16:41 37.167 20.571 0.10 4.0
Я просто хочу напечатать третий и четвертый столбец с одним десятичным знаком. По этой причине я делаю:
awk '{printf "%.1f %.1f\n",$3,$4}' myfile
Проблема в том, что он выдает мне значения с нулями в десятичной части (этот вывод — всего лишь пример, он не является выводом ввода):
37,0 20,0
37,0 20,0
40,0 28,0
34,0 26,0
40,0 20,0
34,0 26,0
34,0 26,0
39,0 24,0
37,0 20,0
39,0 24,0
36,0 21,0
37,0 20,0
37,0 20,0
37,0 20,0
Я действительно не знаю, что происходит...
Мой регион:
decimal_point=","
thousands_sep="."
grouping=-1;-1
numeric-decimal-point-wc=44
numeric-thousands-sep-wc=46
numeric-codeset="UTF-8"
решение1
Как намекается в комментариях, ваша локаль определяет запятую как правильный десятичный разделитель, и, похоже, ваш awk использует именно ее.
TheДокументация GNU awkутверждается, что стандарт требует этого, но (как здесь) это часто считается большей проблемой, поэтому GNU awk не делает этого по умолчанию, а только в режиме POSIX или по запросу с помощью этой --use-lc-numeric
опции.
$ LC_ALL=fi_FI.UTF-8 gawk '{printf "%.1f %.1f\n",$3,$4}' myfile |head -2
37.7 20.6
37.5 20.7
но
$ LC_ALL=fi_FI.UTF-8 POSIXLY_CORRECT=1 gawk '{printf "%.1f %.1f\n",$3,$4}' myfile |head -2
37,0 20,0
37,0 20,0
Конечно, ваш awk может иметь другие настройки, и в руководстве также упоминается, что более старые версии GNU awk также соответствовали этому стандарту.
Проверьте документацию по awk, который вы используете, или просто установите LC_NUMERIC=C
при его запуске принудительное использование локали по умолчанию.