いくつかの数値を含む単純なファイルがあります。
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
実行するときにデフォルトのロケールを強制するように設定してください。