解決済

clip!clip!
Ads By Google

大きなファイルの途中から数行だけ出力したい

linux上で100万行ある数ギガのファイルから
30万行目から10行だけ表示したい時に
一番効率のいい方法はなんでしょうか?


現在下記のようなコマンドを打っていますが
時間がかかって大変です。

head -300010 | tail -10

2006-07-20 15:22の質問
grep  cat  head  less  tail  more  
この質問と回答を読んで役に立った場合は「役に立つ質問」に投票してください。投票が多い質問は、役に立つ質問一覧に掲載され、より多くの人に見てもらうことができます。

回答(1)

1.

2006-07-20 15:53:16ベスト
sed '300000,300010p;d' foo.file
パイプしない分速いような気はしますが、遅かったらごめんなさい。
回答レベル : 回答

かいとういっこしかないのでベスト

Ads By Google

コメント(5)

2006-07-20 16:36:50

>>1
たぶん、どうでもいいと思いますが、1行多かったですw

2006-07-20 18:38:23

sedは基本的に行単位なので、ホールドしない限りは、前の行を覚えていることはないですが、ただファイル終端まで1行読み込んで捨てる作業をするようですねー。head+tailは表示は遅いですが、sedより終わるのは速い気がします。いくつか試したのですが、Cで素朴にプログラム書いたのが一番速かったですw

2006-07-21 01:34:48

perl -e 'open IN,"foo.file";$i=1;while(<IN>){exit if($i==300010);print if($i>=300000);$i++;}'

みたいなのも結構よさげです。同じ書き方でCの方が断然速いですがw意外にRubyはよくなかったのですが、私の書き方が悪いせいかもしれません。

#4.  ひみつ
2006-07-24 13:04:08

そりゃあCで書けば早いけど実稼動してるサーバに
勝手に自作プログラム入れるのもなあ・・・。

perlはギリギリっぽいけど手間は手間ですね。

ちなみに
同じ書き方というからにはperlコンパイラでコンパイルしました?
Cには勝てないとおもいますが、昔と違って同じ条件ならperlは
現在かなり早い部類の言語です。

2006-08-24 20:25:08

ありゃ、役に立ってないのにベストありがとうございます。。。
Cの方は、#3のPerlをコンパイルしたわけではなく、同じようなロジックで書きました。Perlをコンパイルした方が遅いと思います。速さを追求するなら「>=」はダメですよね。。。

トラックバック(2)

トラックバックURL: