2017-01-27 59 views
0

我試圖輸出製表符分隔的結果,該結果使用製表符分隔的文件中的數據組合並減去特定的行。awk使用另一個序列號來調整匹配字段的座標

如果在每行$4匹配則第一匹配順序$6值被添加到$2,除非值1,則使用原始$2(如在第1行的情況下)。這是新的或經調整的$2值。

最後一個匹配連續的$6值被添加到$2,這是新的或調整後的$3值。

$2$3瓦萊斯在格式$1$1組合:$2 - $3$5值被印刷在線路。

只要$4的值是唯一的,下面的awk命令就很好,但情況並非總是如此。我似乎無法添加條件 ,檢查$6並且如果數字不是連續的(1 2是,但之後在92 93 94之間有中斷),那麼當有新的線路中斷時。

也許有另一種方式,但希望這有助於。謝謝:)

文件

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 

所需的輸出

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

AWK

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 

回答

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

+0

最初未經調整的'$ 2'座標是'110956442',所以'92'被添加到這個給你新的'110956534'調整的$ 2'座標。 '94'是原始未調整的'$ 2'座標,給你新的'110956536'調整的$ 3'座標。休息之後的第一個連續數字被添加到'$ 2',並且休息之前的最後一個連續數字被添加到'$ 2'以便獲得調整後的座標。非常感謝你 :)。 – Chris

+0

'awk'非常接近完美,因爲'$ 6 == 1'是原始'$ 1'的值,所以'chrX:110956442-110956535'應該被調整爲'chrX:110956442-110956444 ALG13'用來。非常感謝你 :)。 – Chris

+0

目前它是'chrX:110956443-110956444 \t ALG13',我認爲要調整的行是'first_stop =($ 6 == 1)? 0:6美元;',但似乎並不是這樣。謝謝 :)。 – Chris

相關問題