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

awk使用另一个字段的序列号调整匹配字段的坐标,awk,Awk,我试图输出一个制表符分隔的结果,该结果使用制表符分隔文件中的数据来合并和减去特定的行 如果每行中有$4匹配,则将第一个匹配的顺序$6值添加到$2,除非该值为1,否则将使用原始$2,就像第1行一样。这是新的或调整后的$2值 最后一个匹配的顺序$6值添加到$2,这是新的或调整后的$3值 新的$2和$3淡水河谷与$1组合,格式为$1:$2-$3,行上打印$5值 只要$4的值是唯一的,下面的awk命令就非常有效,但情况并非总是如此。我似乎无法添加条件 这将检查$6,如果数字不是连续的,则为12,但在92

我试图输出一个制表符分隔的结果,该结果使用制表符分隔文件中的数据来合并和减去特定的行

如果每行中有$4匹配,则将第一个匹配的顺序$6值添加到$2,除非该值为1,否则将使用原始$2,就像第1行一样。这是新的或调整后的$2值

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

新的$2和$3淡水河谷与$1组合,格式为$1:$2-$3,行上打印$5值

只要$4的值是唯一的,下面的awk命令就非常有效,但情况并非总是如此。我似乎无法添加条件 这将检查$6,如果数字不是连续的,则为12,但在92 93 94之间有一个断点,当有一个断点时,则为新行

也许还有别的办法,但希望这能有所帮助。谢谢各位:

文件

期望输出

awk

电流输出


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

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。

原始的未调整$2坐标是110956442,因此将92添加到该坐标中,以获得新的调整$2坐标110956534。94是原始的未调整$2坐标,为您提供新的调整$3坐标110956536。为了获得调整后的坐标,将中断后的第一个连续数字添加到$2,并将中断前的最后一个连续数字添加到$2。非常感谢:。awk非常接近完美。唯一的问题是第一行是chrX:110956442-110956535应调整为chrX:110956442-110956444 ALG13,因为使用了$6==1'原始$1`值。非常感谢:。目前是chrX:110956443-110956444 ALG13,我认为要调整的线路是第一站=$6==1?0 : $6;, 但事实似乎并非如此。谢谢您:。
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
chrX 110956442 110956449 ALG13
chrX 110961329 110961334 ALG13
chrX 25031028 25031031 ARX
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);
}