printf, awk...수천 개의 공백으로 숫자 형식을 지정하는 방법

printf, awk...수천 개의 공백으로 숫자 형식을 지정하는 방법

printf, awk, sed를 사용하여 매우 큰 숫자를 천분의 일 단위로 구분하는 쉬운 방법이 있습니까?

따라서 10000000000000은 10 000 000 000 000이 됩니다.

감사해요

답변1

일부 printf구현(GNU printf및 GNU 시스템에 printf내장된 ksh93, 및 (포함 제외 ) 포함 )의 경우 시스템에 프랑스어(적어도 프랑스어 또는 캐나다), 스웨덴어, 슬로베니아어, 마케도니아어 또는 키르기스어 로케일이 있다고 가정합니다 zsh( 그리고 천 단위 구분 기호로 공백이 있는 몇 가지 항목이 더 있습니다.bashlkshdashyash

$ LC_ALL=fr_FR locale -k thousands_sep
thousands_sep=" "
$ LC_ALL=fr_FR printf "%'d\n" 10000000000
10 000 000 000

awk일부 구현 에서도 작동합니다 .

$ LC_ALL=fr_FR awk 'BEGIN{printf "%'\''d\n", 1e10}'
10 000 000 000

설정되지 않은 경우 LC_NUMERIC대신 사용할 수 있습니다.LC_ALLLC_ALL

답변2

다음을 사용하여 반복해야 합니다 sed.

echo "9765625000 * 1024 = 10000000000000" | sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1 \2/;ta'
9 765 625 000 * 1 024 = 10 000 000 000 000

(개선해 주셔서 감사합니다, Stéphane!)

또는 더 나은 가독성을 위해 sed확장 정규식을 사용하면 이전 버전과 호환되지 않을 수 있습니다.

echo "9765625000 * 1024 = 10000000000000" | sed -E -e :a -e 's/(.*[0-9])([0-9]{3})/\1 \2/;ta'
9 765 625 000 * 1 024 = 10 000 000 000 000

답변3

sed와 rev의 간단한 조합을 사용할 수 있습니다.

echo  "I have 10000013984 oranges" | rev | sed "s/[0-9][0-9][0-9]/& /g" | rev 

첫 번째 개정판에서는 숫자를 오른쪽에서 왼쪽으로 바꿔야 하고, 두 번째 개정판에서는 원래 문자열을 복원해야 합니다.

답변4

그리고LANG=nl_BE

awk 'BEGIN {
  I=0
  T=1
  while ( I < 10 ) {
    S = sprintf("%'\''d",T)
    gsub(/\./," ",S)
    print S
    T *= 10
    I++
  }
}'

주어진

1
10
100
1 000
10 000
100 000
1 000 000
10 000 000
100 000 000
1 000 000 000

관련 정보