加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何从Perl文件中获取n个随机行?

发布时间:2020-12-15 22:05:37 所属栏目:大数据 来源:网络整理
导读:跟进 this问题,我需要从文件(或stdin)中随机获得n行.这将类似于头部或尾部,除了我想从中间的一些. 现在,除了使用链接问题的解决方案循环文件之外,在一次运行中获得正好n行的最佳方法是什么? 作为参考,我试过这个: #!/usr/bin/perl -wuse strict;my $ratio
跟进 this问题,我需要从文件(或stdin)中随机获得n行.这将类似于头部或尾部,除了我想从中间的一些.

现在,除了使用链接问题的解决方案循环文件之外,在一次运行中获得正好n行的最佳方法是什么?

作为参考,我试过这个:

#!/usr/bin/perl -w
use strict;
my $ratio = shift;
print $ratio,"n";
while () {
    print if ((int rand $ratio) == 1); 
}

其中$ratio是我想要的线的粗略百分比.例如,如果我想要10行中的1个:

random_select 10 a.list

但是,这并没有给我一个确切的数额:

aaa> foreach i ( 0 1 2 3 4 5 6 7 8 9 )
foreach? random_select 10 a.list | wc -l
foreach? end
4739
4865
4739
4889
4934
4809
4712
4842
4814
4817

另一个想法是啜饮输入文件,然后从数组中随机选择n,但如果我有一个非常大的文件,这是一个问题.

有任何想法吗?

编辑:这是this问题的完全重复.

解决方法

这是我刚刚提出的一个很好的一次通过算法,具有O(N)时间复杂度和O(M)空间复杂度,用于从N行文件中读取M行.

假设M <= N. >设S为选定线的集合.将S初始化为文件的前M行.如果最终结果的排序很重要,请立即洗牌.>阅读下一行l.到目前为止,我们已经读取了总共n = M 1行.因此,我们想要选择l作为最终线之一的概率是M / n.>以概率M / n接受l;使用RNG来决定是接受还是拒绝l.>如果已接受l,则随机选择S中的一行并将其替换为l.>重复步骤2-4,直到文件已用完行,每读取一行新行增加n.>返回所选行的集合S.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读