![awk、sed、または他のものを使用して大容量ファイルから行を効率的に印刷する方法は? [コピー]](https://linux33.com/image/51131/awk%E3%80%81sed%E3%80%81%E3%81%BE%E3%81%9F%E3%81%AF%E4%BB%96%E3%81%AE%E3%82%82%E3%81%AE%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E5%A4%A7%E5%AE%B9%E9%87%8F%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8B%E3%82%89%E8%A1%8C%E3%82%92%E5%8A%B9%E7%8E%87%E7%9A%84%E3%81%AB%E5%8D%B0%E5%88%B7%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AF%EF%BC%9F%20%5B%E3%82%B3%E3%83%94%E3%83%BC%5D.png)
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
常に最速のアプローチです。