printf,awk ...如何将带有空格的数字格式化为千位

rcs*_*pam 6 shell sed awk bc printf

有没有一种简单的方法可以用 printf, awk, sed 分隔每千个非常大的数字?

所以 10000000000000 变成 10 000 000 000 000

谢谢

Sté*_*las 12

对于某些printf实现(包括GNUprintfprintf的内置ksh93zshbashlksh(但不是dash也不yash)在GNU系统),并假设你的系统有一个法语(法国或加拿大至少),或瑞典或斯洛文尼亚和马其顿或吉尔吉斯语言环境(和还有一些,即那些有空格作为千​​位分隔符的):

$ LC_ALL=fr_FR locale -k thousands_sep
thousands_sep=" "
$ LC_ALL=fr_FR printf "%'d\n" 10000000000
10 000 000 000
Run Code Online (Sandbox Code Playgroud)

也适用于一些awk实现:

$ LC_ALL=fr_FR awk 'BEGIN{printf "%'\''d\n", 1e10}'
10 000 000 000
Run Code Online (Sandbox Code Playgroud)

如果您知道未设置LC_NUMERICLC_ALL则可以使用代替LC_ALL


Phi*_*pos 5

你需要循环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
Run Code Online (Sandbox Code Playgroud)

(谢谢你的改进,斯蒂芬!)

或者更好的可读性,但可能与旧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
Run Code Online (Sandbox Code Playgroud)


ami*_*sax 3

可以使用 sed 和 rev 的简单组合 -

echo  "I have 10000013984 oranges" | rev | sed "s/[0-9][0-9][0-9]/& /g" | rev 
Run Code Online (Sandbox Code Playgroud)

第一个 rev 需要从右到左替换数字,第二个 rev 需要恢复原始字符串。