awk特定列的连续行的总和

时间:2016-04-29 23:25:13

标签: awk

chr1    3000035 +   0   0   CHG CTG
chr1    3000037 -   0   0   CHG CAG
chr1    3000045 +   0   0   CHG CAG
chr1    3000047 -   0   0   CHG CTG
chr1    3000048 +   0   0   CHG CTG
chr1    3000050 -   0   0   CHG CAG

大多数数据都是这样的:如何忽略此错误。

我对awk很新,不知道该怎么做。 对于数据集T-C.txt

chr1    3000035 +   0   0   CHG CTG
chr1    3000037 -   0   1   CHG CAG
chr1    3000045 +   0   0   CHG CAG
chr1    3000047 -   0   0   CHG CTG
chr1    3000048 +   3   0   CHG CTG
chr1    3000050 -   0   0   CHG CAG
chr1    3000109 +   0   0   CHG CAG
chr1    3000111 -   0   0   CHG CTG

脚本:

less T-C.txt | awk '{sum=sum+$4+$5}  {if(sum>0) print;} (NR%2==0) {sum=0;}'

产生输出:

chr1    3000037 -   0   1   CHG CAG
chr1    3000048 +   3   0   CHG CTG
chr1    3000050 -   0   0   CHG CAG

虽然我也希望+ strand记录是否同时具有0,因为稍后我必须在第2列使用仅正链的值。

示例:

chr1    3000035 +   2   1   CHG CTG
chr1    3000037 -   0   3   CHG CAG
chr1    3000045 +   0   0   CHG CAG
chr1    3000047 -   0   1   CHG CTG
chr1    3000048 +   0   0   CHG CTG
chr1    3000050 +   0   0   CHG CTG

我有一个类似上面的文件,我正在搜索一些将添加<{p>的awk命令

[column4 of '+' strand + column5 of '+' strand + column4 of '-' strand + column5 of '-' strand]

这意味着每两行如果它们的总和大于0,则将其打印在文本文件上,否则不打印。但应保留只有1个数字(如3000035和3000037)的备用+-,因为这些只被认为是一条记录。 从上面的例子中,只打印以下记录 - 而不是最后2行:

chr1    3000035 +   2   1   CHG CTG
chr1    3000037 -   0   3   CHG CAG
chr1    3000045 +   0   0   CHG CAG
chr1    3000047 -   0   1   CHG CTG

之后我想将总和打印到+ strand值前面的新文件并计算百分比,如

[($4/$4+$5)*100 of '+'strand +($4/$4+$5)*100 of -strand]/2

,结果如下:

chr1    3000035: sum= 6 percentage=['+strand'=66.66+'-strand'=0]/2=33.33%
chr1    3000035 6 33.33

这应该只打印到文件中。 如果有人知道awk命令,请向我解释。

1 个答案:

答案 0 :(得分:0)

此脚本可让您开始实现目标。

将以下内容放入文件中,例如script.awk

$ cat script.awk
NR % 2 == 0 && sum {
    sum += $4 + $5;
    avg = ($4 / ($4 + $5)) * 100;
    if (sum > 0) {
        print prev, sum, (avg + pavg) / 2
    }
}

NR % 2 {
    prev = $1 FS $2;
    sum = $4 + $5;
    if (sum == 0) {
        next;
    }
    pavg = ($4 / ($4 + $5)) * 100
}

$ awk -f script.awk file
chr1 3000035 6 33.3333