Shammer's Philosophy

My private adversaria

AWK CAT

AWKは、何かのテキストファイルを対象に処理することがほとんどだ。そのため、引数にテキストファイルを取らないと話にならない。中身をどのように処理するかはスクリプト次第だが、テキストファイルを扱う際の挙動を知っておきたい。手始めに、catと同じように引数のテキストファイルの中身を全て表示させる処理を書くとこうなる。

#!/usr/bin/awk -f
{
    print $0;
}

これの実行結果は以下のようになる。

AWKTools $ chmod 755 cat.awk 
AWKTools $ echo ABC >> 0.txt
AWKTools $ echo EFG >> 0.txt
AWKTools $ ./cat.awk 0.txt 
ABC
EFG
AWKTools $ 

この{}の前に来るのはパターンというものらしい。行を読み込み、該当する場合にそこが実行される。パターンが未定義の場合はマッチしなかったものが実行される、のだろうか。これを少し書き換えて、偶数行だけ出力させてみる。

#!/usr/bin/awk -f
0 == NR % 2{
    print $0;
}

今何行目かというのは変数(?)NRで参照できる。NR % 2 は行数を 2 で割った余り、その余りが 0 なので偶数行の場合だけ上記ブロックが実行される。先程の 0.txt に対して実行すると以下のようになる。

AWKTools $ ./cat.awk 0.txt 
EFG
AWKTools $ 

1 行目もわかるようにcat.awkを以下のように変更。

#!/usr/bin/awk -f
0 == NR % 2{
    print $0;
}
1 == NR % 2{
    printf "Line Number is %d.\n", NR;
}

この状態で先程の0.txtを引数に渡して実行。

AWKTools $ ./cat.awk 0.txt 
Line Number is 1.
EFG
AWKTools $ 

パターンの種類をどれだけ集めることができるか、これがawk使いの腕になりそうだ。