对具有指定标题的列中的所有值求和

对具有指定标题的列中的所有值求和

我有一个文件,其中包含不同表的部分。我想将每列中包含的所有值与标题 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将总结所有这些

相关内容