Почему printf в awk заменяет десятичные дроби нулями?

Почему printf в awk заменяет десятичные дроби нулями?

У меня есть простой файл с некоторыми числовыми значениями:

 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при его запуске принудительное использование локали по умолчанию.

Связанный контент