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実際、一貫して高速です。両方のコマンドを 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

awk:

$ time awk '(NR>=4000000 && NR<=4000010){print} (NR==4000010){exit}' foo 
real    0m0.955s
user    0m0.868s
sys     0m0.080s

基本的に、解析する量が少ないほど、処理が速くなります。入力を画面に印刷するだけでよいデータ ストリームとして扱う (このようにtail) のが、常に最も高速な方法です。

関連情報