printf、awk ...何千もの空白で数字をフォーマットする方法

printf、awk ...何千もの空白で数字をフォーマットする方法

printf、awk、sedを使用して、非常に大きな数字を千分の1単位で区切る簡単な方法はありますか?

したがって、10000000000000は10 000 000 000 000になります。

ありがとう

答え1

いくつかprintfの実装(GNUprintfおよびGNUシステムにprintf組み込まれている、およびksh93(含まれていない)を含む)の場合、システムにフランス語(少なくともフランス語またはカナダ)、スウェーデン語、スロベニア語、マケドニア語、またはキルギス語のロケールがあるとしますzsh(そして千単位の区切り記号でスペースを持ついくつかの項目があります。bashlkshdashyash

$ 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 

最初のリビジョンでは数字を右から左に変更し、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

関連情報