Diary

Diary

日々学んだことをアウトプットする場として初めてみました

ターミナルでゼロ埋めを行う方法

ターミナル上でゼロ埋め(ゼロパディング)を行いたいことがあったので、その方法についてまとめてみたいと思います。

[目次]

ゼロ埋めを行う方法

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.
...

-fprintfと同じ 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

おわりに

今回は"ターミナルでゼロ埋めする方法"についてまとめました。

状況に応じて使い分けていきたいと思います。