문제

gawk로 대용량 파일을 처리해야 합니다.내 주요 문제는 천 단위 구분 기호를 사용하여 일부 수레를 인쇄해야 한다는 것입니다.예: 10000 다음과 같이 나타나야 합니다. 10.000 그리고 10000,01 ~처럼 10.000,01 출력에서.

나(그리고 Google)는 이 함수를 생각해 냈지만 부동 소수점에서는 실패합니다.

function commas(n) {
  gsub(/,/,"",n)
  point = index(n,".") - 1
  if (point < 0) point = length(n)
    while (point > 3) {
      point -= 3
      n = substr(n,1,point)"."substr(n,point + 1)
    }
  sub(/-\./,"-",n)
  return d n
}

그러나 수레로는 실패합니다.

이제 입력을 정수와 < 1 부분으로 분할한 다음 정수 형식을 지정한 후 다시 붙일 생각인데 더 좋은 방법이 없을까요?

부인 성명:

  • 나는 프로그래머가 아니다
  • 나는 SHELL env를 통해 그것을 알고 있습니다.변수에 천 단위 구분 기호를 설정할 수 있지만 언어 및/또는 로케일 설정이 다른 다양한 환경에서 작동해야 합니다.
  • 영어는 제 2외국어입니다. 잘못 사용했다면 죄송합니다.
도움이 되었습니까?

해결책

유럽 ​​유형 숫자(100만 1/4의 경우 1.000.000,25)를 전달하기 때문에 부동 소수점에서는 실패합니다.쉼표와 마침표만 변경하면 제공한 기능이 작동합니다.비유럽 숫자에서도 작동하는지 확인하기 위해 먼저 1000000.25로 현재 버전을 테스트하겠습니다.

다음 awk 스크립트는 다음을 사용하여 호출할 수 있습니다. "echo 1 | awk -f xx.gawk" 그러면 "일반" 버전과 유럽 버전의 실제 버전이 모두 표시됩니다.다음과 같이 출력됩니다.

123,456,789.1234
123.456.789,1234

당연히 함수에만 관심이 있을 것입니다. 실제 코드는 입력 스트림을 사용하여 고정 문자열이 아닌 함수에 값을 전달합니다.

function commas(n) {
    gsub(/,/,"",n)
    point = index(n,".") - 1
    if (point < 0) point = length(n)
    while (point > 3) {
        point -= 3
        n = substr(n,1,point)","substr(n,point + 1)
    }
    return n
}
function commaseuro(n) {
    gsub(/\./,"",n)
    point = index(n,",") - 1
    if (point < 0) point = length(n)
    while (point > 3) {
        point -= 3
        n = substr(n,1,point)"."substr(n,point + 1)
    }
    return n
}
{ print commas("1234,56789.1234") "\n" commaseuro("12.3456789,1234") }

쉼표와 마침표를 처리하는 점을 제외하면 기능은 동일합니다.다음 설명에서는 이를 구분 기호와 소수라고 부릅니다.

  • gsub는 기존 구분 기호를 다시 넣을 것이므로 기존 구분 기호를 모두 제거합니다.
  • point는 소수점이 시작점이므로 소수점의 위치를 ​​찾습니다.
  • 소수점이 없으면 if 문은 끝에서 시작됩니다.
  • 3자 이상이 남아 있는 동안 반복합니다.
  • 루프 내부에서 구분 기호 삽입 위치를 조정하고 삽입합니다.
  • 루프가 끝나면 조정된 값을 반환합니다.

다른 팁

함께 가야합니다 Pax의 대답:

읽다 GNU Awk 매뉴얼의 "변환"섹션 당신의 효과에 대해 명시 적으로 이야기합니다 LOCALE 숫자 유형의 문자열 표현의 환경 변수.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top