몇 가지 숫자 값이 포함된 간단한 파일이 있습니다.
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
기본 로케일을 강제로 실행하도록 설정하세요.