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
実はいつもより速いです。これら2つのコマンドを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
奇妙な:
$ time awk '(NR>=4000000 && NR<=4000010){print} (NR==4000010){exit}' foo
real 0m0.955s
user 0m0.868s
sys 0m0.080s
基本的に、ルールは解析が少なくなるほど速度が速くなることです。入力を(以前と同様に)画面に印刷するだけのデータストリームとして処理することはtail
常に最速のアプローチです。