seq コマンドを awk で。

いろいろプログラムを作るようになると多用するコマンドがいくつかあります。 その中のひとつが seq コマンドです。 seq コマンドを知ったときには何の役に立つのかすら分かりませんでしたが、自動的に数値を生成してくれるため、様々なテストに用いることもできます。

というわけで、今回もみずぴー日記からです。 seqコマンドをPythonで。からですが、awk ユーザーなら一行野郎で済ませたいところです。 もっとも、awk は大体のものを一行で書くことができますので、一行というところに意味はありません。

条件としては以下のようなものがあります。

  • 引数がひとつの場合には 1 から引数まで 1 づつ加算
  • 引数が 2 つの場合には最初の引数から次の引数まで 1 づつ加算
  • 引数が 3 つの場合には最初の引数から最後の引数まで 2 番目の引数づつ加算
$ awk 'BEGIN{for(i=ARGV[2]?ARGV[1]:1;i<=(ARGV[3]?ARGV[3]:ARGV[2]?ARGV[2]:ARGV[1]);\
i+=ARGV[3]?ARGV[2]:1){print i}}' 5
1
2
3
4
5
$ awk 'BEGIN{for(i=ARGV[2]?ARGV[1]:1;i<=(ARGV[3]?ARGV[3]:ARGV[2]?ARGV[2]:ARGV[1]);\
i+=ARGV[3]?ARGV[2]:1){print i}}' 2 5
2
3
4
5
$ awk 'BEGIN{for(i=ARGV[2]?ARGV[1]:1;i<=(ARGV[3]?ARGV[3]:ARGV[2]?ARGV[2]:ARGV[1]);\
i+=ARGV[3]?ARGV[2]:1){print i}}' 2 2 5
2
4

ここでは条件演算子を入れ子にしていますので、非常に見づらいですが、合っているようです。

そういえば、私は条件演算子を三項演算子と教わってしまったので、癖で三項演算子と呼ぶことが多いのですが、条件演算子というのが正しいそうです。 JavaScriptを知らない私がはまちちゃんのコードを解読してみるとかを見ても意外に知られていないようですね。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png