Chinaunix

标题: 文本随机20列加和 [打印本页]

作者: nina0622    时间: 2020-02-05 21:08
标题: 文本随机20列加和
有个问题想请教一下大家:
文件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列进行相加的模式,但是这次要换成随机的,并且不能重复(已经加和过的列不能重复使用)

谢谢大家



作者: nulcearbear    时间: 2020-02-17 18:36
想要针对文件,随机筛选20列,并对这20列进行加和,筛选到最后不足20列的舍弃

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









欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2