awk打印累计总和的行

时间:2015-11-15 00:24:21

标签: awk

我想打印出文件的行,直到第三个字段的累积和大于0.99,然后只打印出累积和大于或等于0.99的第一行。但是,如果第3行的累积和大于或等于0.99的第一行的字段2与下一行的字段2匹配,则应打印两行。

我的文件如下:

rs76832595 -4.4524 0.501109 
rs74660964 -4.9815 0.49886 
rs12992037 -4.9815 9.8159e-06 
rs934367 -4.3376 3.06953e-06 

期望的输出:

rs76832595 -4.4524 0.501109 
rs74660964 -4.9815 0.49886 
rs12992037 -4.9815 9.8159e-06 

在上面的例子中,字段3的累积和在第2行超过0.99,但我也打印第3行,因为第2行和第3行的字段2相等。如果这些字段不相等,我只打印第1行和第2行。

我有以下命令,它适用于累积和,但不适用于比较相邻行之间的字段2:

awk '{sum+=$3;print $0;if(sum>=0.99)exit}' file

有人可以修改此内容以包含上述要求吗?

1 个答案:

答案 0 :(得分:2)

以下内容应符合您的要求:

鉴于file包含

rs76832595 -4.4524 0.501109 
rs74660964 -4.9815 0.49886 
rs12992037 -4.9815 9.8159e-06 
rs934367 -4.3376 3.06953e-06

以下awk - 脚本

awk '{sum+=$3; print $0; if(sum >= 0.99 && prev_row == $2)exit;prev_row=$2}' file

将产生

rs76832595 -4.4524 0.501109
rs74660964 -4.9815 0.49886
rs12992037 -4.9815 9.8159e-06

脚本中的更改包括在语句末尾添加prev_row=$2以跟踪上一行,并将prev_row合并到if语句中。