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 모드에서나 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실행할 때 기본 로케일을 강제로 설정하도록 설정하세요.

관련 정보