awk使用另一个的顺序号调整匹配字段的坐标

时间:2017-01-27 00:17:42

标签: awk

我正在尝试输出制表符分隔的结果,该结果使用制表符分隔文件中的数据来组合和减去特定行。

如果testtorun_ig1_1在每一行中匹配,则第一个匹配的顺序$4值会添加到$6,除非值为$2,然后是原始1使用(就像第1行的情况一样)。这是新的或调整后的$2值。

最后匹配的顺序$2值已添加到$6,这是新的或已调整的$2值。

$3$2个字母与$3 $1格式$1$2 - $3和{{1}合并值打印在该行上。

只要$5值是唯一的,awk命令就可以很好地工作,但情况并非总是如此。我似乎无法添加条件 检查$4,如果数字不是连续的(1 2是,但是在92 93 94之间有一个中断),当有一个中断新线时。

也许有另一种方式,但希望这会有所帮助。谢谢:))

文件

$6

所需的输出

chrX    110956442   110956535   chrX:110956442-110956535    ALG13   1   19
chrX    110956442   110956535   chrX:110956442-110956535    ALG13   2   19
chrX    110956442   110956535   chrX:110956442-110956535    ALG13   92  18
chrX    110956442   110956535   chrX:110956442-110956535    ALG13   93  18
chrX    110956442   110956535   chrX:110956442-110956535    ALG13   94  18
chrX    110961329   110961512   chrX:110961329-110961512    ALG13   2   1
chrX    110961329   110961512   chrX:110961329-110961512    ALG13   3   1
chrX    25031028    25031925    chrX:25031028-25031925  ARX 651 3

AWK

chrX:110956442-110956444    ALG13
chrX:110956534-110956536    ALG13
chrX:110961331-110961332    ALG13
chrx:25031679-25031679  ARX

当前输出

awk 'FNR==NR {S[$4]++;next} ($4 in S){if(S[$4]>1){print $1 OFS $2 OFS $2+S[$4] OFS $5;} 
else {if($6==1){print $1 OFS $2 OFS $2 OFS $5}
else {print $1 OFS $2+$6 OFS $2+$6 OFS $5}};delete S[$4]}' file file

1 个答案:

答案 0 :(得分:1)

这可以满足您的大部分需求:

function myprint(start, first, last, key) {
    print "chrX:" (start + first) "-" (start + last) "\t" key;
}

NR == 1 {
    last_start = $2;
    key = $5;
    first_stop = $6;
    last_stop = $6;
    next;
}

{
    if ($2 == last_start) {
        if ($6 != (last_stop + 1)) {
            myprint(last_start, first_stop, last_stop, key);
            first_stop = $6;
        }
    } else {
        myprint(last_start, first_stop, last_stop, key);
        last_start = $2;
        first_stop = ($6 == 1) ? 0 : $6;
    }
    key = $5;
    last_stop = $6;
}

END {
    myprint(last_start, first_stop, last_stop, key);
}

但是,我花了很长时间才了解您的要求,而且我仍然不明白为什么您期望的输出的第二行是chrX:110956534-110956628 ALG13,因为94 - 92 == 2