harry’s memorandum

おれおれメモ

Linuxで連番するおさらい

とにかく連番で出力させたい、っていうたわいもない話なんですが。

rubyperlが使えれば、適当にワンライナー書けばいいんですけど..

$ ruby -e '(1..5).each {|n| printf("%05g\n",n)}'
00001
00002
00003
00004
00005

とはいえ、シェルでなんとかして、と言われることも多々あるので。

seq

やっぱりseqが便利ですね。

$ seq 5
1
2
3
4
5

組み合わせれば0パディングも余裕。まじ余裕。

$ seq 3 |\
> while read n
> do
>   printf "%02g\n" $n
> done
01
02
03

seqのオプションでもパディング。こっちの方がいいじゃないか。

# -w, --equal-width
#   桁数を揃えるために (先頭を) 0 で埋める。
$ seq -w 5 10
05
06
07
08
09
10

フォーマット指定もできる。

# -f FORMAT, --format=FORMAT
#     printf(3) のフォーマットに FORMAT を用いる。(デフォルト: %g)
$ seq -f "%010g.jpg" 5 10
0000000005.jpg
0000000006.jpg
0000000007.jpg
0000000008.jpg
0000000009.jpg
0000000010.jpg

区切りもできる。便利この上ない。

# -s SEP, --separator=SEP
#     数値を SEP で区切る。(デフォルト: ‘\n’)
$ seq -s ',' 5 10
5,6,7,8,9,10

bash

bashが使えればブレース展開も。

$ echo {1..10}
1 2 3 4 5 6 7 8 9 10

bc

bcだって。でも使う理由がどう考えても見つからない。

$ bc -l -q
for (i=1; i<=5; i++) { print i,"\n" }
1
2
3
4
5

cat

catで無理して頑張ってみるという方法も。

$ repeat 5 {echo ""} | cat -n
     1
     2
     3
     4
     5

zsh

やはり本命はzshです。repeatと++演算子が使える。

$ n=1
$ repeat 5 echo $((++n))
1
2
3
4
5

zshなら素直にこれでパディングかな。

$ echo {0..3}
0 1 2 3
$ echo {0..0}{0..3}
00 01 02 033
$ echo {0000..0003}
0000 0001 0002 0003

zsh最強、と言いたいところですが、業務サーバにzshなんて入っているとは思えないので、seqってことですね。