800 万行のプレーンテキスト ファイルがあり、4,000,010 行目から 4,000,000 行目を画面に出力したい場合、awk と sed のどちらがより効率的でしょうか。
テキストにはパターンがなく、残念ながらデータベースは選択肢にありません。これは理想的ではないことは承知していますが、どちらの方がタスクをより早く完了できるか知りたいだけです。
あるいは、sed や awk よりもさらに優れた代替手段があるのでしょうか?
答え1
どちらも使用しない場合は、代わりにtail
または を使用しますhead
。
$ time tail -n 4000001 foo | head -n 11
real 0m0.039s
user 0m0.032s
sys 0m0.004s
$ time head -n 4000010 foo | tail -n 11
real 0m0.055s
user 0m0.064s
sys 0m0.036s
tail
実際、一貫して高速です。両方のコマンドを 100 回実行し、平均を計算しました。
しっぽ:
real 0.03962
user 0.02956
sys 0.01456
頭:
real 0.06284
user 0.07356
sys 0.07244
tail
4e10 行目までシークする必要があるものの、実際にはそこに到達するまで何も印刷されないのに対し、head
4e10 + 10 行目まではすべて印刷されるため、より高速であると想像します。
時間順に並べた他の方法と比較してみましょう。
sed:
$ time sed -n 4000000,4000011p;q foo
real 0m0.312s
user 0m0.236s
sys 0m0.072s
パール:
$ time perl -ne 'next if $.<4000000; print; exit if $.>=4000010' foo
real 0m1.000s
user 0m0.936s
sys 0m0.064s
awk:
$ time awk '(NR>=4000000 && NR<=4000010){print} (NR==4000010){exit}' foo
real 0m0.955s
user 0m0.868s
sys 0m0.080s
基本的に、解析する量が少ないほど、処理が速くなります。入力を画面に印刷するだけでよいデータ ストリームとして扱う (このようにtail
) のが、常に最も高速な方法です。