免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2026 | 回复: 2
打印 上一主题 下一主题

[文本处理] 文本随机20列加和 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2020-02-05 21:08 |只看该作者 |倒序浏览
有个问题想请教一下大家:
文件test如下(有n行n列):

A 0 9 7 8 8 3 67 167 123 ...
B 9 7 6 2 0 9 167 178 1189 ...
C 89 5 8 0 29 0 1 7 832 980 ...

想要针对文件,随机筛选20列,并对这20列进行加和,筛选到最后不足20列的舍弃

生成文件result:
A 1078 3678 890 ...
B 676 278 889 ...
C 679 235 870 ...

可能比较麻烦的是随机这一关,我写完了代码是按照顺序的20列进行相加的模式,但是这次要换成随机的,并且不能重复(已经加和过的列不能重复使用)

谢谢大家


论坛徽章:
0
2 [报告]
发表于 2020-02-17 18:36 |只看该作者
想要针对文件,随机筛选20列,并对这20列进行加和,筛选到最后不足20列的舍弃

是说每行随机选20列加和并把加和结果放在最后就行了(只执行1次)
还是每行随机20列的加和放在最后,然后继续迭代这行,直到输出的列数小于20列?
另外舍弃是什么意思?
另外这个问题shell脚本解决起来太麻烦了,python倒是很容易。

论坛徽章:
0
3 [报告]
发表于 2020-02-26 10:58 |只看该作者
本帖最后由 Looiml 于 2020-02-26 11:54 编辑

先生成个测试数据:
  1. $ for i in {A..Z};do echo $i {1..100}; done>c.txt
复制代码


假定每一行都是取的相同随机列参与求和:cat test.awk
  1. BEGIN{
  2.         N=100
  3.         C=20
  4.         #generate the sequential array
  5.         for(i=1;i<=N;i++)a[i]=i
  6.         #shuffle the array
  7.         srand()
  8.         for(i=1;i<=N;i++){
  9.                 ri=int(rand()*N)
  10.                 t=a[i]
  11.                 a[i]=a[ri]
  12.                 a[ri]=t
  13.         }
  14. }
  15. NF>=C{
  16.         printf $1" "
  17.         #summarize C columns each time until no more C coulumns available
  18.         for(i=1;i+C<=N+1;i+=20){
  19.                 sum=0
  20.                 for(j=0;j<C;j++)sum+=$a[i+j]
  21.                 printf("%d ",sum)
  22.         }
  23.         print ""
  24. }
复制代码
得到结果:awk -f test.awk c.txt
  1. A 1118 958 844 960 1070
  2. B 1118 958 844 960 1070
  3. C 1118 958 844 960 1070
  4. D 1118 958 844 960 1070
  5. E 1118 958 844 960 1070
  6. F 1118 958 844 960 1070
  7. G 1118 958 844 960 1070
  8. H 1118 958 844 960 1070
  9. I 1118 958 844 960 1070
  10. J 1118 958 844 960 1070
  11. K 1118 958 844 960 1070
  12. L 1118 958 844 960 1070
  13. M 1118 958 844 960 1070
  14. N 1118 958 844 960 1070
  15. O 1118 958 844 960 1070
  16. P 1118 958 844 960 1070
  17. Q 1118 958 844 960 1070
  18. R 1118 958 844 960 1070
  19. S 1118 958 844 960 1070
  20. T 1118 958 844 960 1070
  21. U 1118 958 844 960 1070
  22. V 1118 958 844 960 1070
  23. W 1118 958 844 960 1070
  24. X 1118 958 844 960 1070
  25. Y 1118 958 844 960 1070
  26. Z 1118 958 844 960 1070
复制代码




您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP