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 编辑
先生成个测试数据:
$ for i in {A..Z};do echo $i {1..100}; done>c.txt
复制代码
假定每一行都是取的相同随机列参与求和:cat test.awk
BEGIN{
N=100
C=20
#generate the sequential array
for(i=1;i<=N;i++)a[i]=i
#shuffle the array
srand()
for(i=1;i<=N;i++){
ri=int(rand()*N)
t=a[i]
a[i]=a[ri]
a[ri]=t
}
}
NF>=C{
printf $1" "
#summarize C columns each time until no more C coulumns available
for(i=1;i+C<=N+1;i+=20){
sum=0
for(j=0;j<C;j++)sum+=$a[i+j]
printf("%d ",sum)
}
print ""
}
复制代码
得到结果:awk -f test.awk c.txt
A 1118 958 844 960 1070
B 1118 958 844 960 1070
C 1118 958 844 960 1070
D 1118 958 844 960 1070
E 1118 958 844 960 1070
F 1118 958 844 960 1070
G 1118 958 844 960 1070
H 1118 958 844 960 1070
I 1118 958 844 960 1070
J 1118 958 844 960 1070
K 1118 958 844 960 1070
L 1118 958 844 960 1070
M 1118 958 844 960 1070
N 1118 958 844 960 1070
O 1118 958 844 960 1070
P 1118 958 844 960 1070
Q 1118 958 844 960 1070
R 1118 958 844 960 1070
S 1118 958 844 960 1070
T 1118 958 844 960 1070
U 1118 958 844 960 1070
V 1118 958 844 960 1070
W 1118 958 844 960 1070
X 1118 958 844 960 1070
Y 1118 958 844 960 1070
Z 1118 958 844 960 1070
复制代码
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2