我一直在挣扎,我无法使脚本工作。请帮助。
我的txt文件扩展到500列。
我需要删除列5,9,13,21,...,始终删除n = 4列。
然后,在删除上面提到的列后,我需要添加所有列,但不仅考虑第1列。为此,我正在使用:
awk '{print $1,$2+$3+.........}' >> comb.xvg
事情是不想手动添加直到我达到500。
我的最终文档应只有两列。
- 从一开始的第一个
- 以及具有所有其他总和的另一列(请注意,我在水平而不是垂直添加(。总和是从第2列到第500列的水平完成的。
有人可以帮我这样做吗?我尝试了使用循环的不同集合,但它们失败了。
我是新手,也使用堆栈。如果我不完全清楚,请我道歉,但我无法上传图片。
谢谢。
awk
to Rescue!
此脚本将总结列2,3,4、6,7,8、10,..(跳过5,9,... 4K 1 ...(
awk '{sum=0; for(i=2;i<=NF;i++) sum+=(i-1)%4?$i:0; print $1,sum}'
说明我们正在总结行中的元素。如果我们将它们全部添加,sum+=$i
会这样做,但是您要跳过索引2k+1
的值,因此我们使用三元运算符v = c?a:b,那是 if(c) v=a; else v=b
。(i-1)%4
是4个模量,对于i = 5,9,...,2k 1的模量为零。
删除列似乎并不需要,因为您没有打印结果面板。
测试
$ seq 20 | xargs -n 10 | awk ...
打印
1 40
11 110
要验证:sum(2 3 ... 10(= 54,因此在删除5和9后,您将获得40。对于sum(12 13 ... 20(,它是10个对于每个元素,即40 7*10 = 110。
后续问题:如何添加S2 = 2,6,10 ...;S3 = 3,7,11 ...;S4 = 4,8,12 ...
awk '{s2=s3=s4=0;
for(i=2;i<=NF;i+=4)
{s2+=$i; s3+=$(i+1); s4+=$(i+2)};
print $1, s2, s3, s4}'