有没有一种简单的方法可以用 printf、awk、sed 分隔千分之很大的数字?
所以 10000000000000 变成 10 000 000 000 000
谢谢
答案1
对于某些printf
实现(包括 GNUprintf
和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
第一个 rev 需要从右到左替换数字,第二个 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