head by awk 22010年11月24日 11時10分57秒

head を awk で実装したが、同じ事する別の書き方が出来る。十行は例で出し続けるには長いので、五行だけの出力にする。

以下のものが前回のもの。


% nawk '{print; if(NR >= 5) exit 0}' /etc/defaults/rc.conf 
#!/bin/sh

# This is rc.conf - a file full of useful variables that you can set
# to change the default startup behavior of your system.  You should
# not edit this file!  Put any overrides into one of the ${rc_conf_files}
%

以下のものが、若干書き換えたもの。

% nawk '{print}NR >= 5{exit 0}' /etc/defaults/rc.conf
#!/bin/sh

# This is rc.conf - a file full of useful variables that you can set
# to change the default startup behavior of your system.  You should
# not edit this file!  Put any overrides into one of the ${rc_conf_files}
%

前者は条件式{式}を基礎とし、条件式{式;式} の型で応用している。後者は条件式{式}条件式{式}と、二つの基礎を並べて、一つのプログラムを構成している。

また、前者では条件式が if によって明示されている。それに対し、後者では暗示的に条件が示されている。

動作自体はどちらも同じになる。また、他の言語から見比べると、後者の型はとても奇異に映り、awk 初心者を惑わせる。また、awk に慣れたと感じてきても、なかなかこちらの書式は使わない。どうしても他の言語で馴染んだ前者の型を使ってしまうのだ。実は後者の型の方が二つの面で優れている。

一つ目は、if 文で囲む形が続くと必然と if に合わせてインデントを入れるので、どんどんと深くなっていく。元々、一行に詰め込む形で書くことの多い awk では、if が重なると、見づらくなる。

二つ目は、大きい一組だとプログラムの分割が出来ないが、二組だと分けることが出来る。細かく分けることで、良く使い回す式などをライブラリとして別ファイルに記述しやすくなる点があげられる。

とは言ったものの、awk は使い捨てが基本。あまり書式には拘らなくても最初は困らない。後々になって awk で出来ることが増えて、プログラムが大きくなってきてから、これらが役に立つ。

今回の要点。

  1. 条件式{式;式}条件式{式}条件式{式}の比較
  2. 条件式{式}条件式{式}の比較の方がインデントが少ない。
  3. 条件式{式}条件式{式}の比較の方がライブラリとして別ファイルに記述しやすい。
  4. NR

前回