printf、awk ...如何格式化具有千位空格的数字

printf、awk ...如何格式化具有千位空格的数字

有没有一种简单的方法可以用 printf、awk、sed 分隔千分之很大的数字?

所以 10000000000000 变成 10 000 000 000 000

谢谢

答案1

对于某些printf实现(包括 GNUprintf和GNU 系统上printf内置的ksh93zshbashlksh(但不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_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 

第一个 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

相关内容