我有一个简单的文件,其中包含一些数值:
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 似乎使用的。
这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
在运行它时设置以强制使用默认区域设置。