awk コマンドでヘッダーやフッターを出力する

テキストを扱う awk というコマンドがあります。

このコマンド、かなり便利なのですが、 できることが多過ぎるので覚えるのは結構大変だったりします。 「基本的な使い方はわかるけど・・・」という人も多いのではないでしょうか。 自分へのメモの意味も含めて機能を紹介したいと思います。

次のテキストを処理します。( test.txt )

1 2 3
4 5 6
7 8 9
10 11 12

まず基本的な使い方です。

$ cat test.txt | awk '{print $2}'

2
5
8
11

awk の書式で {} の前にはパターンを書くことができます。

{} の前に何も書かないのは、全ての行にマッチ(全ての行に対して処理をする)という指定になります。 (これについてはまた別の機会に詳しく書きたいと思います)

今回は、BEGIN と END という特殊な指定を使いますが、BEGIN は「最初の行の前」にマッチする指定で END は「最後の行の後」にマッチする指定です。これを使ってヘッダーやフッターを出力します。

次のような指定ができます。

$ cat test.txt | \
>     awk 'BEGIN {print "-- header --"} END {print "-- footer --"}'

-- header --
-- footer --

BEGIN と END の指定しかないので、ヘッダーとフッターのみが出力されました。

プログラムの部分が長くなるので、別ファイル( prog.txt )に指定して 引数で読み込むようにします。

次のような指定をしてみます。

BEGIN {
    print " f1 | f2 | f3 ";
    print "----+----+----";
}
{
    printf("%4d|%4d|%4d\n", $1, $2, $3);
}

BEGIN (前半)と 全ての行にマッチする指定(後半)をしました。

次のような結果になります。

$ cat test.txt | awk -f prog.txt

 f1 | f2 | f3
----+----+----
   1|   2|   3
   4|   5|   6
   7|   8|   9
  10|  11|  12

ヘッダーと本体が出力されました。

次はフッターに合計行を出したいと思います。
awk は計算もできます。

BEGIN {
    print " f1 | f2 | f3 ";
    print "----+----+----";
    f1=0;
    f2=0;
    f3=0;
}
{
    printf("%4d|%4d|%4d\n", $1, $2, $3);
    f1=f1+$1;
    f2=f2+$2;
    f3=f3+$3;
}
END {
    print "----+----+----";
    printf("%4d|%4d|%4d\n", f1, f2, f3);
}

初期化処理は BEGIN に書くことができます。

次のような結果になります。

$ cat test.txt | awk -f prog.txt

 f1 | f2 | f3
----+----+----
   1|   2|   3
   4|   5|   6
   7|   8|   9
  10|  11|  12
----+----+----
  22|  26|  30

合計行を出力することができました。

ちょっとしたときにサッと書けるとカッコ良いですね。

Google サイト内検索

Amazonアソシエイト