Printf、awk、sedを使用して非常に大きな数を1000ごとに分離する簡単な方法はありますか?
したがって、10000000000000は10 000 000 000 000になります
ありがとう
Sedとrevの単純な組み合わせを使用できます-
echo "I have 10000013984 oranges" | rev | sed "s/[0-9][0-9][0-9]/& /g" | rev
最初のリビジョンは数値を右から左に置き換えるために必要で、2番目のリビジョンは元の文字列を戻すために必要です。
いくつかのprintf
実装(GNU printf
およびprintf
組み込みのksh93
、zsh
を含む、 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
を使用できます。
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
現在のロケールで定義されている3桁ごとの区切り文字で問題がなければ、Perl
Number :: 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
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
ありがとうございます、
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回の繰り返しに一致します。
\>単語の末尾の単語境界に一致します。