![对具有指定标题的列中的所有值求和](https://linux22.com/image/116456/%E5%AF%B9%E5%85%B7%E6%9C%89%E6%8C%87%E5%AE%9A%E6%A0%87%E9%A2%98%E7%9A%84%E5%88%97%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%E5%80%BC%E6%B1%82%E5%92%8C.png)
我有一个文件,其中包含不同表的部分。我想将每列中包含的所有值与标题 N*dN 相加
例如:
omega (dN/dS) = 999.00000
dN & dS for each branch
branch t N S dN/dS dN dS N*dN S*dS
11..6 0.000 532.0 266.0 999.0000 0.0000 0.0000 3.0 0.0
11..7 0.000 532.0 266.0 999.0000 0.0000 0.0000 4.0 0.0
11..12 0.000 532.0 266.0 999.0000 0.0000 0.0000 0.5 0.0
omega (dN/dS) = 1.00000
dN & dS for each branch
branch t N S dN/dS dN dS N*dN S*dS
11..6 0.000 532.0 266.0 999.0000 0.0000 0.0000 7.0 0.0
11..7 0.000 532.0 266.0 999.0000 0.0000 0.0000 2.0 0.0
11..12 0.000 532.0 266.0 999.0000 0.0000 0.0000 0.4 0.0
期望的输出:
7.5
9.4
也许一些修改
awk '{s+=$8}END{print s}'
我可以在其中指定列的标题并使其打印每个总和的单独结果,而不是总和的总和...
答案1
您可以awk
以这种方式使用(假设内容后面始终跟着匹配的标头并且所有计数相同+它们之间没有发生空行)。
awk 'f{s+=$8;f++} ($8=="N*dN"){f=1} (f>4){print s;f=s=0}' infile
或者在一般情况下,如下使用它。它将汇总到N*dN
第 8 列中的下一个:
awk 'f{s+=$8} (f &&$8=="N*dN"){print s;f=s=0} ($8=="N*dN"){f=1} END{print s}' infile
答案2
其他awk方法:
awk '$8=="N*dN"{ r=NR; if(s) print s; s=0 }r && NR-r<5{ s+=$8 }END{ print s }' file
输出:
7.5
9.4
答案3
嗯,从程序员的角度来看,这并不是什么有趣的事情,但它确实很快,并且对于简单的任务来说是可以的。
正如我们所看到的,所有有趣的行都包含字符串..
,因此我们可以使用 来过滤它们grep
:
grep -F '..' <input.txt|awk 'BEGIN{s=0}{s+=$8}END{print s}'
要对多列执行此操作,您必须使用多个变量(例如,$a
, $b
, $c
, ...)。
答案4
你可以使用这样的东西:
(awk '{if($8=="N*dN")next}{print 0$8}' data.txt | tr '\n' '+'; echo 0) | bc -l
{if($8=="N*dN")next}
丢弃无用的标头
{print 0$8}
打印带有前导“0”的第 8 个字段(将用 0 替换空字段)。
tr '\n' '+'; echo 0
将用“+”和尾随 0 替换行尾
bc -l
将总结所有这些