paste改良版
30分プログラム、その122。
id:Gemmaさんからの挑戦状。
『問題。100万行のファイルでも大丈夫なように改良しなさい。』
使い方
ファイルの生成はワンライナーで。
$ perl -e 'print "a\n"x1000000' > a
で、実行するとこうなる。
$ ruby big.paste.rb [a-c] a b c a b c a b c a b c a b c a b c ... ... ...
ちなみに処理時間。
$ time ruby big.paste.rb [a-c] > /dev/null ruby big.paste.rb [a-c] > /dev/null 20.77s user 0.44s system 90% cpu 23.405 total $ time paste [a-c] > /dev/null paste [a-c] > /dev/null 1.16s user 0.04s system 91% cpu 1.312 total
さすがに、本物は速い。
ソースコード
もとのやつよりシンプルになった。
あと、俺はexit直前のfreeはしない宗派です。
#! /opt/local/bin/ruby -w # -*- mode:ruby; coding:utf-8 -*- # # big.paste.rb - # # Copyright(C) 2007 by mzp # Author: MIZUNO Hiroki <hiroki1124@gmail.com> # http://mzp.sakura.ne.jp/ # # Timestamp: 2007/09/02 22:42:00 # # This program is free software; you can redistribute it and/or # modify it under the same terms as Ruby itself. # # ネタ: # system "paste #{ARGV.join(' ')}" files = ARGV.map{|path| File.open path } until files.all?{|file| file.eof? } do files.map{|file| file.gets.to_s.chomp }.join("\t") end
参考
- 過去の30分プログラム
- id:mzp:20070831:paste