awk의 printf가 소수를 0으로 바꾸는 이유는 무엇입니까?

awk의 printf가 소수를 0으로 바꾸는 이유는 무엇입니까?

몇 가지 숫자 값이 포함된 간단한 파일이 있습니다.

 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

문제는 소수 부분에 0이 있는 값을 제공한다는 것입니다(이 출력은 단지 예일 뿐이며 입력의 출력이 아닙니다).

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기본 로케일을 강제로 실행하도록 설정하세요.

관련 정보