シェルスクリプトで桁あわせいろいろ

久しぶりに使う機会があったので、備忘として。


あと、以前、桁合わせにスクリプトでごにょごにょやってたけど、もっと簡単にできるので記載しておく。
シェルスクリプトによるファイルの間引き part2 - KuroNeko666’s blog

ゼロパディング(ゼロフィル)

桁合わせに、ゼロで埋める(パディング)、もしくはゼロで満たす(フィル)。

$ num=1
$ printf "%03d\n" $num


コマンドとしては printf を使う。
%d がデシマル(10進数)での表記。
それを 3 桁で表示。
不足する分はゼロで埋める。
なので、上記のコマンドは "001" が表示される。
最後に \n を入れているのは、改行を示したいから。

ゼロサプレス

数値の先頭ゼロを抑止(サプレス)して出力すること。
削除する場合と、ゼロをスペースに置換する場合の2種類。

スペース表示(1:数値の桁合わせ)

ゼロサプレスの方法その 1 は、ゼロパディングとやり方が同じ。
ただ 0 を指定しなければスペースが入るという。

$ num=1
$ printf "%3d\n" $num


表示としては " 1" なんだけど、わかりにくい。
シェルスクリプトで数値として扱うと、スペースは消えちゃう。

スペース表示(2:ゼロ置換)

次のゼロサプレスは、もともとある 0 をスペースで置換する方法。

$ num=$(printf "%03d" 1)
$ echo ${num} | sed 's/0/ /g'

表示としては " 1" となる。

ゼロ削除

ついでに、ゼロを削除したい場合。


01月01日…とかを 1月1日 にしたいとかいう、ゼロを消したい場合に有効。
もちろん 2015年01月20日 を対象にすると 215年1月2日 になってしまうので、元データの書式には十分注意する。

$ num=$(printf "%03d" 1)
$ echo ${num} | sed 's/0//g'


表示としては "1" になる。



いずれにしても、改行をさせたくないなら printf コマンドで変数を表示させ \n を付けなければ良い。


最初から桁数が分かっていて、bash で for 文などで利用する桁合わせなら、ブレース展開もアリかな。
echo {0..123}
こう書くと、0~123 まで出力される。

echo {00..123}
こう書くと、00~123 まで出力される。

echo {000..123}
これを書くと、000~123 まで出力される。

for ii in {000..125}
do
    echo ${ii}
done

こんな感じ。