為什麼 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

我只想列印第三列和第四列,保留一位小數。因此我這樣做:

    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在運行它時設定以強制使用預設區域設定。

相關內容