ランダムに行を抜き出すプログラム

30分プログラム、その433。テキストファイルからランダムに行を抜き出すプログラム。
1000行ぐらいあるCSVから特定のデータを抜き出さないといけないらしい。しかも、かなり表記にゆれがある。とりあえず、適当にデータを抜き出して傾向を調査しようと思う。

というわけで、テキストファイルからランダムに行を抜き出すプログラムを書いてみた。書いてから気がついたけど、元のテキストファイルに出てくる順番に出力するべきだった気がする。まあ、今回の対象は順不同のデータだし、まあいいか。

使い方

# 1 - 100 までからランダムに3個取り出す
$ seq 1 100 | perl random.pl  3
97
37
95

# 1 - 100 までからランダムに10個取り出す
$ seq 1 100 | perl random.pl  10
5
98
58
96
20
83
90
54
72
16

ソースコード

#! /usr/bin/perl
# -*- mode:perl; coding:utf-8 -*-
#
# random.pl -
#
# Copyright(C) 2008 by mzp
# Author: MIZUNO Hiroki / mzpppp at gmail dot com
# http://howdyworld.org
#
# Timestamp: 2008/12/09 20:47:28
#
# This program is free software; you can redistribute it and/or
# modify it under MIT Lincence.
#

use strict;
use warnings;
use Data::Dumper;

sub choice_one(@){
    my (@xs) = @_;
    my $n = @xs;
    print Dumper(int(rand($n)));
}

sub choice($@){
    my ($n,@xs) = @_;
    if($n == 0){
	();
    }else{
	my $m = @xs;
	my $i = int(rand($m));
	my @ys = (@xs[0..$i-1],@xs[$i+1..$m-1]);
	($xs[$i],&choice($n-1,@ys));
    }
}

my $n = shift @ARGV;
foreach(choice($n,<>)){
    print $_;
}