awkのprintfが素数をゼロに変更するのはなぜですか?

awkのprintfが素数をゼロに変更するのはなぜですか?

いくつかの数値を含む単純なファイルがあります。

 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

3列目と4列目を小数点以下1桁まで印刷したいです。だから私はこうします:

    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が使用しているように見える正しい小数点区切り文字としてコンマを定義します。

これGNU awkドキュメント宣言的な標準はこれを要求しますが(ここでのように)一般的に問題と見なされるため、GNU awkはデフォルトではこれを行わず、POSIXモードまたはoptionsで要求した場合にのみ実行します--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実行するときにデフォルトのロケールを強制するように設定してください。

おすすめ記事