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 は使い捨てのプログラムを書く事が多く、メモリを浪費したとて一時的なものだ。

コメント

_ 半袖 ― 2009年01月05日 16時51分57秒

インストールされている事が前提ですが、tacと言うコマンドがあります。
catの反対だからtac…洒落た名前のコマンドです。

_ (未記入) ― 2009年01月05日 21時53分23秒

つtac

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2009/01/02/4039164/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。