【问题标题】:awk to print out lines for cumulative sumawk 打印出累积和的行
【发布时间】:2015-11-15 00:24:20
【问题描述】:

我想打印文件的行,直到第三个字段的累积和大于 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 

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

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

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

有人可以修改它以纳入上述要求吗?

【问题讨论】:

    标签: awk


    【解决方案1】:

    以下内容应符合您的规范:

    鉴于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 语句中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 2023-01-20
      • 2018-07-12
      • 2011-06-20
      • 1970-01-01
      相关资源
      最近更新 更多