printf、awk、sedを使用して、非常に大きな数字を千分の1単位で区切る簡単な方法はありますか?
したがって、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
最初のリビジョンでは数字を右から左に変更し、2番目のリビジョンでは元の文字列を復元する必要があります。
答え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