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