2006-11-13

seq で 0 padding した数字列を作る

Linux の seq コマンドは、シンプルな数列を作ってくれる。例えば、1 から 10 までの数字を表示させるには次のやうにする。

$ seq 10
1
2
3
4
5
6
7
8
9
10

途中の数字から始めたい場合は、その数字を第一引数にとる。5 から 10 までの数字列を得る場合の例は次の通り。

$ seq 5 10
5
6
7
8
9
10

このコマンドを何に使うのかというと、shell script の中で連番ファイルを作成するのに活用する。例えば、こんな感じ。

#!/bin/bash
for i in `seq 10`; do
  echo $i.jpg
done

echo コマンドの代わりに、wget を使えば、連番ファイルのダウンロード。touch コマンドを使えば、連番ファイルの作成。etc...

0 padding

さて、10 個以上の連番ファイルを作る場合、0 パディングを加えておくと便利。というのも、ls コマンドは、ファイル名をリスト表示させる時に、(数字じゃなくて) 文字順でファイルを並べるから。実例を見せる方が早い。foo1.jpg から foo10.jpg までのファイルを ls で表示すると、次のやうになる。

$ ls
1.jpg  10.jpg  2.jpg  3.jpg  4.jpg  5.jpg  6.jpg  7.jpg  8.jpg  9.jpg

そこで、数字の前に 0 を加えてやる。

$ ls
01.jpg  02.jpg  03.jpg  04.jpg  05.jpg  06.jpg  07.jpg  08.jpg  09.jpg  10.jpg

すると、上のやうに数字が並ぶ。

-w オプション

0 パディングした数字列を得るには、-w オプションを使う。つまり、上のファイル群を作るは、かうする。

for i in `seq -w 10`; do
  touch $i.jpg
done

ぼくは -w オプションを知らなくって、printf コマンドを使ってた。つまり、こんな感じ。

for i in `seq 10`; do
  j=`printf "%02d" $i`
  touch $j.jpg
done

何て無駄なことをしてたんだらう!

-f オプション

更に今回、記事を書く為に man コマンドを引いて、-f オプションがあることも知った。-f オプションは、フォーマット文字列を受け付ける。つまり、printf コマンドと同じことができる。例えば、こんな感じに使う。

for f in `seq -f "foo%02g.jpg" 10`; do
  echo $f
  touch $f
done

seq が内部的に実数を扱ってるってのは、びっくり。

seq は seq 始まりの数 増加分 終わりの数 という書式を取れるので、もしやと小数の増加分を加えたら成功した。

seq -f '%4.2f' 1 0.1 2
1.00
1.10
1.20
1.30
1.40
1.50
1.60
1.70
1.80
1.90

なるほどね。

あとがき

このエントリーは、odz buffer の以下の二つのエントリーに触発されて書いた。

No comments:

Post a Comment