\r\n\r\n
Linuxのseqコマンドは、数字のリストを瞬時に生成することができます。しかし、この機能を実用化するにはどうしたらいいのでしょうか?seqがどのように便利なのか、ご紹介します。
一見すると、Linuxのseqコマンドはちょっと不思議な感じがする。数列を素早く生成することができる、ただそれだけのことですただし、ここでのキーワードは「速い」です。この小さなコマンドがいかに速く機能するか、すぐにおわかりいただけると思います。
seqコマンドは、1985年にUnixのバージョン8で追加されたコマンドです。それ以来、ずっとそこにあるのだから、何か価値のあることをやっているのだろう。
Unixの哲学は、一つのことをうまくやる小さなユーティリティに満ちていることです。この哲学の中心的な考え方の一つは、他のプログラムからの入力を受け入れるプログラムを書くことである。もちろん、そのためには、他のプログラムが入力として使えるような出力を出さなければならない。
seqコマンドは、その出力を使用する他のコマンドと一緒に使用すると(パイプまたはコマンドライン拡張機能を介して)、それ自身のコマンドになります。
コマンドライン引数として数字を指定して seq を開始すると、1 からその数字までカウントします。そして、その数値は次のように1行に1桁ずつ、端末ウィンドウに表示されます。
seq 6コマンドラインに2つの数字が入力された場合、次のように最初の数字が開始番号、2番目の数字が終了番号になります。
seq 4 103桁目を含めることで、ステップの長さを設定することができます。開始桁と終了桁の間に位置する。6から始まり48で終わる数字のリストを6刻みで作成するようにseqに依頼するために、次のようなコマンドを入力します。
seq 6 6 48seq に数字の大きいものから小さいものまでのリストを作らせることもできますが、そのためには負のステップを与えなければなりません。
次のコマンドは、そのステップを負の数として入力するため、24から12までを6単位で数えるリストを生成する。
seq 24 -6 12スタート、エンド、ステップの数値は10進数も可能です。これらの数値のいずれかが10進数である場合、他の数値も10進数とみなされます。次のコマンドは、ステップサイズ0.2の数値のリストを生成します。
seq 1 0.2 2seqは非常に高速で、ボトルネックはターミナルウィンドウにコマンドを入力する時間だけです。その速度をテストするために、25万個の数字のリストが必要である。
以下のコマンドを入力し、timeコマンドで処理が完了するまでの時間を確認します。
time seq 250000結果はリストの一番下に表示されています。seqは、中程度の性能のテストPCでも驚くほど高速に動作します。
約1/3秒で全リストが作成され、画面に書き込まれます。リストをファイルにリダイレクトすれば、ターミナルウィンドウに入力するオーバーヘッドを避けることもできる。
そのために、次のように入力します。
time seq 250000 > numbers.txtリストの完成とファイルの作成にかかる時間は、約1/7秒になりました。
改行文字は、リスト内の各数字の間に表示されるデフォルトの文字です。そのため、縦長のリストとして、各番号が1行ずつ表示されます。必要であれば、別のセパレータ文字を指定することも可能である。
例えば、カンマ区切りのリスト、コロンで区切られたリスト、その他の句読点や記号を作成する必要があるとします。セパレータは実際には文字列であるため、複数の文字を使用することができる。
ここでは、-s(セパレーター)オプションを使用します。次のコマンドを実行すると、カンマで区切られたリストが生成されます。
seq s, 6 6 36このコマンドでは、セパレータとしてコロン(:)を使用します。
seq -s: 6 6 36このコマンドは、seqにハイフン(-)2つをセパレータとして使用するように指示します。
seq -s-- 6 6 36seq コマンドは、C スタイルのフォーマット文字列もサポートしています。これらは、単にセパレータ文字を指定するのではなく、出力をフォーマットすることができます。フォーマット文字列を使用するには、-f(format)オプションを使用します。
次のコマンドは、seq に 0 を使って出力を 2 文字で埋めるように指示します。
seq -f "%02g" 6次のように、文字列を好きなテキストでフォーマットし、数字を文字列の任意の場所に配置することができます。
seq -f "Number %02g in a C-like format string" 6ゼロパディングを設定する最も早い方法は、-w (等幅) オプションを使用することです。これは、seq にゼロを使って数字を埋めるように指示し、すべての数字が最大の数字と同じ幅になるようにします。
次のコマンドは、0から1000までを100単位でカウントし、すべての数字がゼロで埋め尽くされます。
seq -w 0 100 1000最も長い数字で4文字かかるので、それ以下の幅の数字はすべてその幅にゼロを詰める(ゼロが4個になるようにパディングしてもよい)。
セパレータに数学記号を設定し、そのリストをbcコマンドに取り込めば、そのリストの数字を計算することができる。
次のコマンドは、アスタリスク(*)で区切られた、1から始まり6で終わる数字のリストを生成します。
seq -s* 6このリストをbcに入力すると、アスタリスク(*)を乗算記号として使って計算することになる。
seq -s* 6 | bc次のコマンドは、プラス記号(+)を使って、すべての数字を加えたリストを作成します。
seq -s+ 5次のように入力してbcに取り込み、リストを評価します。
seq -s+ 5 | bctouchコマンドは、ファイルのタイムスタンプと日付スタンプを更新します。ファイルが存在しない場合、touchはファイルを作成します。touchとseqを使ったコマンドラインの拡張機能を使って、トピックで名前を付け、異なる番号を付けたファイルのコレクションを作ることができる。
基本的な名前は同じで、異なる番号(file-1.txt, file-2.txt, etc)を持つ10個のファイルのセットを作成します。以下のように入力します。
touch $(seq -f "file-%g.txt" 1 10)そして、次のように入力して、ファイルを確認します。
ls file*Bashスクリプトでseqを使って、小数の循環を制御することができる。
以下の文章をエディターに入力し、「loop.sh」という名前で保存してください。
#!/bin/bash for val in $(seq 5 0.2 6.6); do echo "The value is now: $val" done次に、新しいスクリプトを実行可能にするために、次のように入力します。
chmod +x loop.shスクリプトを実行すると、ループカウンタがターミナルウィンドウに表示されます。そして、次のように入力すると、ループの反復ごとに10進数ループカウンタが増加するのを見ることができます。
./loop.shseq は逆方向にもカウントできることを覚えておいてください。同じようにループの中で使うことができます。
seqの特徴のひとつは、学習曲線があまりないことです。マニュアルページが爽やかなほど短いのに、楽しく使うことができる。
現実的なサイズのテストファイルを素早く作成する必要があることが多いので、seqとフォーマット文字列を併用しています。出力は、任意の行数の疑似データを含むファイルを作成するためにリダイレクトされます。