web-dev-qa-db-ja.com

printf、awk ...数をスペースで数にフォーマットする方法

Printf、awk、sedを使用して非常に大きな数を1000ごとに分離する簡単な方法はありますか?

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

ありがとう

6
rcspam

Sedとrevの単純な組み合わせを使用できます-

echo  "I have 10000013984 oranges" | rev | sed "s/[0-9][0-9][0-9]/& /g" | rev 

最初のリビジョンは数値を右から左に置き換えるために必要で、2番目のリビジョンは元の文字列を戻すために必要です。

3
amisax

いくつかのprintf実装(GNU printfおよびprintf組み込みのksh93zshを含む、 GNUシステム)のbashおよびlksh(ただしdashまたはyashは除く)およびシステムにフランス語があると仮定(少なくともフランスまたはカナダの)、またはスウェーデン語、スロベニア語、マケドニア語、またはキルギス語ロケール(さらにいくつか、つまり、1000の区切り文字としてスペースがあるもの):

$ 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を使用できます。

12

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

(改善をありがとう、ステファン!)

またはより読みやすいですが、拡張正規表現を持つ古い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
5
Philippos

現在のロケールで定義されている3桁ごとの区切り文字で問題がなければ、PerlNumber :: Format モジュールを次のように使用できます。

$ Perl -e 'use Number::Format qw(format_number);
           print format_number(shift),"\n"' 10000000000000
10,000,000,000,000

(読みやすくするために追加された改行。すべて1行で入力できます)

ロケールに関係なく数千をスペースで区切りたい場合:

Perl -e 'use Number::Format;
         my $num= new Number::Format(-thousands_sep=>" ");
         print $num->format_number(shift), "\n"' 10000000000000
10 000 000 000 000
2
cas

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
1
Gerard H. Pille

ありがとうございます、

Sedで自分に合った解決策を見つけました。整数と浮動小数点(小数点以下3桁未満)で動作します。

echo 12120013984.235 |  sed ':a;s/\B[0-9]\{3\}\>/ &/;ta'

私はそれをここで見つけました: http://shallowsky.com/blog/linux/cmdline/sed-insert-commas.html 説明付き:

\ BWordの境界以外のものに一致します。

[0-9]任意の数字に一致します。

\ {3 \}その前にあるもの(この場合は数字)の3回の繰り返しに一致します。

\>単語の末尾の単語境界に一致します。

1
rcspam