免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8301 | 回复: 6

请教awk大量随机取数问题 [复制链接]

论坛徽章:
0
发表于 2009-07-23 11:18 |显示全部楼层
如何从1000W行里随机抽取10W行数据?

论坛徽章:
0
发表于 2009-07-23 11:37 |显示全部楼层
awk的rand()与srand()函数可以获取随机值,但好像间隔时间太短生成的是一样的。
还可以利用系统的一些方法生成随机数,如:
1、
  1. echo $((16#`dd if=/dev/urandom bs=1 count=4 2>/dev/null| od -A n -t x4|sed s/[^1-9a-fA-F]//g`)) %10000000|bc
复制代码

2、
  1. echo $(date  --rfc-3339=ns|awk -F "[ \t.+]" '{printf("%d\n",$3)}') % 10000000 |bc
复制代码

生成随机数后,可以用
  1. sed -n "$i p"
复制代码
打印得到的行。

再加个循环就行了。
上面随机方式有可能会取到重复行,如果不希望重复,可以取一行,从原文件中删除一行(可以用临时文件),之后以-1取余;或者再生成一个已提取的行号组合文件,再次提取时检索一下即可。(但这个行数太多,不知道什么方法才能更好。有可能用数据库是个好办法)

论坛徽章:
0
发表于 2009-07-23 11:40 |显示全部楼层

回复 #2 sjhf 的帖子

谢谢。有没有人写个AWK的?效率要高哦。

[ 本帖最后由 star_wm_craft 于 2009-7-23 11:41 编辑 ]

论坛徽章:
0
发表于 2009-07-23 12:01 |显示全部楼层
file 1000w行,随机输出100w行
  1. awk 'BEGIN{srand();while (n<1000000) {num=int(rand()*10000000)+1;if (!(num in a)) {a[num]=1;n++}}}NR in a' file
复制代码

论坛徽章:
0
发表于 2009-07-23 12:02 |显示全部楼层

回复 #4 ywlscpl 的帖子

就是这个了。。^_^
谢谢。。

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
发表于 2009-07-23 12:15 |显示全部楼层
  1. awk 'BEGIN{srand()}
  2. (rand()<0.0101){print rand(),NR,$0}' urfile|sort -k1,1 -s|awk '{$1="";print}
  3. NR=100000{exit}'|sort -k1,1 -s|'{$1="";print}
复制代码

论坛徽章:
0
发表于 2009-07-25 00:17 |显示全部楼层
估计楼主并不追求数学意义的严格随机,仅是抽样1%
建议分段抽样,如每1W行一组,产生一组随机数,再根据随机数输出
awk '
BEGIN{
   f0=100; #分组大小
   f0r=10; #每组取样
   srand();
}
function myout(){
   if(f1<f0)f0=f1;
   f2=int(f1/f0r);
   for(i=0;i<f2;i++){
     while(b[k=1+int(rand()*f1)]);
     b[k]=1;
   }
   for (i in b){ print a;}
   #如果要按原次序,将上句加#注解,下句去掉#:
   #for (i=1;i<=f1;i++){ if(b)print a;}
   delete a;
   delete b;
   ftotal+=f1;
   f1=0;
}
{
   a[++f1]=$0;
   if(f1==f0){
      myout();
   }
}
END{
  myout();
}
'
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP