ターミナル上でゼロ埋め(ゼロパディング)を行いたいことがあったので、その方法についてまとめてみたいと思います。
[目次]
ゼロ埋めを行う方法
printf
format をかけて print します。この記述の仕方は様々な言語で使われているので、他の形式もぜひ覚えておきたいです。
# d: 整数値が入る # 3: 3 桁で表示 # 0: 足りない桁数は 0 でパディング $ printf '%03d\n' {1..5} 001 002 003 004 005 # g: 実数をいい感じに? $ printf '%03g\n' {1..3} 001 002 003
seq
seq のオプションで使えそうなものがないか調べてみると、-f と -w なんかが使えそうです
$ man seq The seq utility accepts the following options: -f format Use a printf(3) style format to print each number. Only the E, e, f, G, g, and % conversion characters are valid, ... ... -w Equalize the widths of all numbers by padding with zeros as necessary. This option has no effect with the -f option. ...
-f
は printf
と同じ format で指定できるオプションみたいです。
また、-w はオプション1つで 0 埋めをしてくれるものらしいです。
# E, e, f, G, g しか使えないらしい $ seq -f %03g 3 001 002 003 # うめる 0 の数は指定できない(最大桁数になる) $ seq -w 97 100 097 098 099 100
seq + awk
あまり使う機会がないかもしれませんが、seq のオプション等が思いつかなかった時は下のように泥くさくやることもできます。
標準入力やファイル入力で与えられるものに対し、広く適応できるのが強みだと思います。
# 桁数分だけ 0 をつけた後、下 2 桁だけ取り出す $ seq 8 13 |\ awk '{a="00"$1; print substr(a, length(a)-1,length(a))}' 08 09 10 11 12 13 # 以下のような標準入力を渡すこともできる $ echo -e "p 3 hoge\ni 14 fuga" |\ awk '$2=substr("00"$2, length("00"$2)-2)' p 003 hoge i 014 fuga
(おまけ)ゼロ埋めされた値を計算に使う
ゼロ埋めされた数値(文字?)も、通常の計算方法に使うことができました。
$ echo $((04*02)) 8 $ echo '04*003' | bc 12
おわりに
今回は"ターミナルでゼロ埋めする方法"についてまとめました。
状況に応じて使い分けていきたいと思います。