从一个文件中随机抽取N行方法

从M行的文件随机抽取N行(可以假定M>=N),这是需要对数据进行抽样处理时很长常见的需求。

首先想到的方法是每读取一行,扔一个0到M-1的随机数,如果随机数小于N,则输出该行,否则不输出。Perl源代码如下:

 

#!/usr/bin/perl

# subset.pl 

# Usage: sub_set.pl file sample_num

 

if (@ARGV != 2) {

    die "Usage: $0 sample_file sample_num/n";

}

 

 

my ($sample_file, $sample_num) = @ARGV;

 

open my $fh, "<$sample_file"     or die "Cannot open $sample_file to read $!";

 

my $all_num = `wc -l $sample_file |awk '{print $1}'`;

 

 

while (<$fh>) {

    if (rand($all_num) < $sample_num) {

        print;

     }

}

 

这个程序的缺陷是输出的行数只是粗略等于N(由于随机性的原因)。

 

下面是能输出确定N的版本:

 

#!/usr/bin/perl

# fixed_num_subset.pl 

# Usage: fixnum_sub_set.pl file sample_num

 

if (@ARGV != 2) {

    die "Usage: $0 sample_file sample_num/n";

}

 

 

my ($sample_file, $sample_num) = @ARGV;

 

open my $fh, "<$sample_file"     or die "Cannot open $sample_file to read $!";

 

my $all_num = `wc -l $sample_file |awk '{print $1}'`;

 

my %labels;

my $k = $sample_num;

 

for (my $i = 0; $i < $all_num; $i++) {

    if (rand($all_num-$i) < $k ) {

         $labels{$i} = 1;

         $k--;

    }

}

 

 

my $i = 0;

 

while (<$fh>) {

    if (exists $labels{$i}) {

        print ;

    }

    $i++;

}

这个程序可以严格地随机输出N行数据。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值