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

参考