numfmtで数字を読みやすく(その1)


アニメ『ヒナまつり』

身寄りのない超能力少女ヒナは、新田の家に住み込むことで、中学校に通えて、炊事をしなくてもイクラ丼を食べられて、暇な時はゲームをする何不自由ない生活です。一方、同じ超能力少女のアンズの方は、働かないとごはんが食べられないので、空き缶集めが数百円にしかならなくても、毎日当たり前のように働いて感心な子です。もうアンズがよい子すぎてしょうがない。アンズを見てると心がきれいになるようです。

アンズから見たら、ヒナの家が、どれほどの金持ちなのか分からないのではないでしょうか。(ホームレスの時の)アンズは,(カンマ)が必要となる桁のお金を、普段持ってませんので。

今回は、数字を読みやすくするコマンドnumfmtです。数字をカンマ区切りに変換してみましょう。

まずは、100000000を、100,000,000に変換。

takk@deb9:~/tmp$ numfmt --grouping 100000000
100,000,000
takk@deb9:~/tmp$ 

–groupingオプションをつけて、引数に数字を指定するだけです。
もちろん複数指定できます。

takk@deb9:~/tmp$ numfmt --grouping 1000 2000 3000
1,000
2,000
3,000
takk@deb9:~/tmp$ 

パイプで渡す場合は、改行区切りでも、

takk@deb9:~/tmp$ seq 1000 100 1400 | numfmt --grouping
1,000
1,100
1,200
1,300
1,400
takk@deb9:~/tmp$ 

空白区切りでも指定できます。

takk@deb9:~/tmp$ seq 1000 100 1400 | xargs numfmt --grouping
1,000
1,100
1,200
1,300
1,400
takk@deb9:~/tmp$ 

指定の仕方を変えると、こういうことですね。

takk@deb9:~/tmp$ numfmt --grouping `seq 1000 100 1400`
1,000
1,100
1,200
1,300
1,400
takk@deb9:~/tmp$ numfmt --grouping `seq -s' ' 1000 100 1400`
1,000
1,100
1,200
1,300
1,400
takk@deb9:~/tmp$ seq -s' ' 1000 100 1400
1000 1100 1200 1300 1400
takk@deb9:~/tmp$ 

数値のマトリクスの場合どうなるでしょうか。

takk@deb9:~/tmp$ seq 1000 100 2400 | pr -t3J | tee sample.txt
1000	1500	2000
1100	1600	2100
1200	1700	2200
1300	1800	2300
1400	1900	2400
takk@deb9:~/tmp$ 

適当に数字を並べた、マトリクスをファイル化して、これを引数で指定してみましょう。

takk@deb9:~/tmp$ numfmt --grouping sample.txt
numfmt: invalid number: `sample.txt'
takk@deb9:~/tmp$ 

ファイルを指定することはできませんでした。あくまでも数字じゃないといけないようですね。

では標準入力を使いましょう。

takk@deb9:~/tmp$ cat sample.txt | numfmt --grouping
1,000 1500 2000
1,100 1600 2100
1,200 1700 2200
1,300 1800 2300
1,400 1900 2400
takk@deb9:~/tmp$

もしくはこれ。

takk@deb9:~/tmp$ numfmt --grouping < sample.txt
1,000 1500 2000
1,100 1600 2100
1,200 1700 2200
1,300 1800 2300
1,400 1900 2400
takk@deb9:~/tmp$ 

どちらにしても、なぜか、先頭列の数字しか変換できませんでした。

実はマトリクスを渡す場合、変換列を指定する必要があります。
–fieldオプションを使います。

takk@deb9:~/tmp$ cat sample.txt | numfmt --grouping --field=2
1000 1,500 2000
1100 1,600 2100
1200 1,700 2200
1300 1,800 2300
1400 1,900 2400
takk@deb9:~/tmp$ cat sample.txt | numfmt --grouping --field 2
1000 1,500 2000
1100 1,600 2100
1200 1,700 2200
1300 1,800 2300
1400 1,900 2400
takk@deb9:~/tmp$ 

全列を変換するには、-を指定します。

takk@deb9:~/tmp$ cat sample.txt | numfmt --grouping --field -
1,000 1,500 2,000
1,100 1,600 2,100
1,200 1,700 2,200
1,300 1,800 2,300
1,400 1,900 2,400
takk@deb9:~/tmp$ 

まあアンズと同じく、私もカンマが2つ必要な数字には、ご縁がありません。それがアンズを見ていて気分が良い理由かもしれません。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA