Jul 04, 2011

awk (1) 小技

先日参加した勉強会で awk (1) 関連の発表があったので、 ちょっとした小技を紹介してみる。

system() を利用する際の注意
awk の中で外部コマンドを実行する場合は 組み込み関数 system() が利用できるが、 この関数を利用して外部コマンドを実行すると 入出力 stream がオープンされるので、 ファイルディスクリプタが消費されてしまう。
従って awk 内で何度も system() を実行すると、 オープンできるディスクリプタの上限を超過してしまい、 awk の実行が中断されてしまう可能性がある。
その場合 close() を利用して system() がオープンした stream を閉じれば良いのだが、 awksystem() では stream を明示的に扱わない。 そこで system() で実行したコマンドを close() の引数で指定する事で stream を閉じる事ができる。
  1awk '{
  2    :
  3    # コマンドを生成
  4    command = sprintf("%s %s %s", command, arg1, arg2);
  5    # コマンドを実行して結果を取得
  6    buf = system(command);
  7    # stream をclose
  8    close(command);
  9    :
 10}'
            
関数内ローカルな変数の使用
nawkfunction を利用する事で 内部関数を作成する事ができるが、 関数内でローカルな変数を明示的に定義する事ができない。 そこで関数宣言の仮引数部に変数を定義する事で、 関数内ローカルの変数として利用できる。
  1awk '{
  2        :
  3    # 関数 foo の定義
  4    #   num: ループ数
  5    # 以下ローカル変数
  6    #   i: ループウンタ
  7    function    foo(num,        i)
  8    {
  9        # i はローカル変数扱いなので呼出元の i は影響を受けない
 10        for(i=0; i<1num; i++)
 11            :
 12        }
 13    :
 14    foo(num);
 15        :
 16    }'
            
但し関数呼び出し時と関数定義時に引数の数が等しくないので、 後に混乱しないためにコメントで明記するなどの処置は必要。

Edit this entry...

wikieditish message: Ready to edit this entry.
















A quick preview will be rendered here when you click "Preview" button.