gawk: 쉼표 구분 기호로 형식화된 부동 소수점 숫자 합계

gawk: 쉼표 구분 기호로 형식화된 부동 소수점 숫자 합계

gawk가 정수 계산을 수행하는 동안 쉼표를 구분 기호로 사용하여 부동 소수점의 합계를 계산하려고 합니다. 스크립트는 다음과 같습니다.

BEGIN {
  FS=";"
  OFS=";"
  CONVFMT = "%2.2f"
}
{ 
  print $1
  print $2
  print $1+$2 
}

나는 이 데이터 파일을 사용하고 있습니다:

4,3;5,7

다음과 같이 스크립트를 호출하십시오.

LC_ALL=fr_BE gawk -f test.awk < t.txt

나는 다음과 같은 결과를 얻습니다.

4,3
5,7
9

fr_BE 로케일을 설정했지만 결과가 여전히 올바르지 않습니다. 이 문제를 어떻게 해결할 수 있나요?

답변1

대답은 --use-lc-numericgawk 옵션을 사용하는 것입니다.

--use -lc-번호

이는 gawk가 입력 데이터를 구문 분석할 때 로케일의 10진수 문자를 사용하도록 강제합니다. POSIX 표준에서는 이 동작을 요구하고 gawk는 --posix가 적용될 때 그렇게 하지만 기본값은 마침표가 소수점이 아닌 로케일에서도 레거시 동작을 따르고 마침표를 소수점으로 사용하는 것입니다. 성격. 이 옵션은 --posix 옵션의 전체 엄격함 없이 기본 동작을 재정의합니다.

다음 데이터 파일이 있다고 가정해 보겠습니다.

$ cat t.txt 
4,3;5,7
4,9;5,7

출력을 더 쉽게 볼 수 있도록 다음 줄을 변경했습니다 test.awk.

print "Total: "$1+$2 

이제 위 스위치를 사용하여 실행하면 다음과 같습니다.

$ LC_ALL=fr_BE gawk --use-lc-numeric -f test.awk < t.txt
4,3
5,7
Total: 10
4,9
5,7
Total: 10,60

인용하다

답변2

문제는 gawk문자열을 4,3float로 변환할 수 없다는 것입니다. ,로 교체하여 해결할 수 있습니다 .. @glenn jackman의 경우 다음을 입력합니다.

BEGIN {
  FS=";"
  OFS=";"
  CONVFMT = "%2.2f"
}
{
  gsub(",",".",$0)
  print $1
  print $2
  print $1+$2
}

$ LC_ALL=fr_BE gawk -f test.awk < file
4.3
5.7
10
4.9
5.7
10.6

관련 정보