Linux で数字をコミュニティ化するのは見た目ほど簡単ではない
今日、大量のPostgreSQLデータベーステーブルを処理し、それぞれの行数を報告する必要がありました。その情報を入手したら、このデータに対してさらに計算を行い、適切な形式で出力する必要がありました。理由はここでは割愛しますが、シェルを使う必要がありました。
でも、最後の部分にたどり着くまでは、それはすべて些細なことでした。それはコミフィケーションに関わるのです。
そもそも単語なの?私のブラウザのスペルチェッカーは「commify」も認識しない。commificationは1950年代にマルクス主義が広まったことを表す言葉だと思うかもしれないが、実際は「数字にコンマを付ける」という意味だ。つまり、100000000を100,000,000にするという意味だ。
もちろん、一部の国では100,000,000を見て、なぜ小数点以下が2桁なのかと聞かれるでしょう。インドでは1,00,00,00,00と表記されるのが一般的ですが、私にとってはインド人にとって100,000,000が混乱するのと同じくらい混乱します。しかし、地域に関係なく、問題は同じです。
Linuxには、文字、数字、記号の文字列を変換、切り取り、解析、分割、結合、折り畳み、曲げ、置換、置き換え、そしてほぼあらゆる変形を施すツールがあります。実際、テキスト処理はUnixの最大の強みの一つであり、初期のUnixは主にテキスト処理に使用されていました。
しかし、一見したところ、Linux用のシンプルなコマンドを見つけることができませんでした。PythonとPerlでこれを行う方法についての小さなスニペットはありますが、コマンドラインでこれを行う簡単な方法があるはずです。そうですよね?
間違っている。
これを実現するために、 長大なスクリプトを書いた人もいます。そのスクリプトからコメントと空行を除くと、20行になります。数値をフォーマットするためだけに、20行もの解釈シェルコードが使われているのです!
幸いなことに、これを行う必要はありません。1行で実行できます。
$エコー100000000 | sed ':a;s/\(^\|[^0-9.]\)\([0-9]\+\)\([0-9]\{3\}\)/\1\2,\3/g;ta'
1億ドル
なるほど、簡単ですよね? sedコマンドを1文字ずつ見ていきましょう…えっと、ちょっと待ってください!冗談ですよ。ちなみに、これはGNU sedでのみ機能します。sed FAQ で他のオプションについても説明されています。
でも、時間を無駄にしないでください。簡単に覚えられるほどシンプルな方法をお見せしましょう。
これをチェックしてください:
$ echo 100000000 | printf "%'d\n" 100000000
1億ドル
素晴らしいですね!これは、bash と ksh の最新バージョン(93 以降 – 2022 年現在でも ksh88 を使っている場合は、カウンセリングが必要です)で動作します。
printf に commify するように指示するのは、% 記号の後のアポストロフィです。
次回、この方法を Google で検索したときに見つけられるようにこの記事を書いたという指摘は、おそらく正しいでしょう。