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

Некрасиво, но

$ echo '2 + 2 = $$shell:echo 2 + 2 | bc$$ // and some text here' | 
  sed -e 's/\(.*\)\$\$shell:\(.*\)\$\$\(.*\)/printf "%s%s%s\n" "\1" "$(sh -c "\2")" "\3"/e'
2 + 2 = 4 // and some text here
2
25.10.2021, 11:59
1 ответ

Как указано в комментариях, ваша локаль определяет запятую как правильный десятичный разделитель, и ваш awk, кажется, использует именно его.

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

3
25.10.2021, 12:35

Теги

Похожие вопросы