awk、sed、または他のものを使用して大容量ファイルから行を効率的に印刷する方法は? [コピー]

awk、sed、または他のものを使用して大容量ファイルから行を効率的に印刷する方法は? [コピー]

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

tail4e10行までずっと見なければなりませんが、そこに到達するまで実際に何も印刷せず、head4e10+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常に最速のアプローチです。

おすすめ記事