AWKの一行野郎

わずか一行のプログラムで、 AWKでは現実的で便利な処理ができます。そん なプログラムを一行野郎とか one linersと呼びます。一行 野郎は、スクリプトファイルを作らずに、次の例のようにコマンドラインにプ ログラムを直接書くのが粋です。ここに上げる例は、みなgawkのマニュアルに 載っていたものです。例中のdatafileは処理したいファイル名に置き換えてく ださい。

    % gawk '{ if (length($0) > max) max = length($0) } END { print max }' datafile
この一行野郎は、datafileの行の最大の長さを出力します。

    % gawk '{if (length($0)>m) m=length($0)} END{print m}' datafile
一行野郎では変数名はうんと短かくて良いと思います。これは一つ目の一行野 郎の変数maxをmに変えて、分りにくくならない程度に空白も取り除いたもので す。

    % gawk 'length($0) > 80' datafile'
80文字を超える行だけを出力します。

    % gawk 'NF > 0' datafile
少なくとも一つのフィールドがある行だけを出力します。つまり、空白文字だ けの行を削除します。

    % gawk 'BEGIN { for (i = 1; i <= 7; i++) print int(101 * rand()) }'
0から100までの範囲で、ランダムな数を7個、出力します。

    % gawk 'END { print NR }' datafile
レコードの値、つまり入力の行数を出力します。

    % gawk 'NR % 2 == 0' datafile
入力の偶数行だけを出力します。これを使うと、 Cなどで計算した結果をファ イルに保存しておけば、刻み幅で計算結果を間引くことなどが簡単にできます。

    % ls -lg FILES | awk '{ x += $5 } ; END { print "total bytes: " x }'
複数のファイルのサイズの総計を求めます。FILESにはファイル名を列挙した り、シェルのワイルドカードを使って対象ファイルを指定します。

    % ls -lg FILES | awk '{ x += $5 } END { print "total K-bytes: " (x + 1023)/1024 }'
キロバイト単位にしたいのなら、最後で少し計算を加えれば良いですね。

OGURISU Osamu
2004-01-15