2005-03-25
_ whileとawk
あるテキストファイルの各行末にタイムスタンプをシェルスクリプトで付加したいのだがどうしたらいい?という質問を受けて単純にwhile文を作成してみたら1000件処理するのに11秒もかかっていたので,これはまずいと少し調べてみました.シェルスクリプトでのテキスト処理としてはsedやawkが定番です.今回はこの要望をawkを使って実現してみました.
まずとっても遅いwhile版のソースは以下のようになります.
#/bin/sh while read LINE do echo $LINE `date +%Y-%m-%d-%H.%M.%S` done < hoge.txt
このスクリプトで1000行のファイルを読み込み,行末にタイムスタンプを付加したときの実行時間は,
$ time while.sh real 0m11.78s user 0m2.33s sys 0m7.56s
次にawkを使って同様の出力結果を表示する場合は,
awk '{cmd="date +%Y-%m-%d.%H%M.%S";cmd|getline d; print $0,d}' hoge.txt
このスクリプトで1000行のファイルを読み込み,行末にタイムスタンプを付加したときの実行時間は,
time awk '{cmd="date +%Y-%m-%d.%H%M.%S";cmd|getline d; print $0,d}' hoge.txt real 0m0.19s user 0m0.03s sys 0m0.13s
明らかに実行時間に差があることがわかりました.10000件処理してもawkの場合は1秒程度ですんだので,これは大きな差です.ただ問題はタイムスタンプが全て同じになってしまうということ.この辺をどういう風に処理したらいいのかなぁ…