awk 演習: ファイルの最後の行から最初の行へ表示2009年01月02日 09時58分38秒

さて、これも比較的使うパターン。最終行から最初の行へ向かって表示する。cat の出力の行を入れ換えた様なものだ。

UNIX のコマンドで、この様な動作をするものがあったと思ったのだが、どうも見つけられない。この程度のプログラムであれば、一分以上掛けてプログラムを見つけられなかったら、十五秒で新しくプログラムを書いてしまった方が、早い部類だ。


% cat reverse-lines.awk
{line[NR] = $0}
END{for(i = NR; i > 0; i--) print line[i]}

一番簡単なアルゴリズムは、全ての行を一旦メモリに保持して、ファイルを読み終わった後に最終行から表示する方法だ。

% (echo 1; echo 2; echo 3) | cat
1
2
3
% (echo 1; echo 2; echo 3) | awk -f reverse-lines.awk
3
2
1

line と言う連想配列に、各行をインデックスとして入力を保存する。END 句にて、最終行 NR から 1 行目まで for ループで出力する。

この様に入力を全てメモリに置く方法は、入力ファイルが大きいと大量のメモリを消費する。ただ、メモリ搭載量は処理するデータの量に比例して大きくなる事が多いので、実体験上では問題になった事はない。むしろ、awk は使い捨てのプログラムを書く事が多く、メモリを浪費したとて一時的なものだ。