printf, awk, sed를 사용하여 매우 큰 숫자를 천분의 일 단위로 구분하는 쉬운 방법이 있습니까?
따라서 10000000000000은 10 000 000 000 000이 됩니다.
감사해요
답변1
일부 printf
구현(GNU printf
및 GNU 시스템에 printf
내장된 ksh93
, 및 (포함 제외 ) 포함 )의 경우 시스템에 프랑스어(적어도 프랑스어 또는 캐나다), 스웨덴어, 슬로베니아어, 마케도니아어 또는 키르기스어 로케일이 있다고 가정합니다 zsh
( 그리고 천 단위 구분 기호로 공백이 있는 몇 가지 항목이 더 있습니다.bash
lksh
dash
yash
$ 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_ALL
LC_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