2017-01-27 6 views
0

タブ区切りファイルのデータを使用して特定の行を結合したり引いたりするタブ区切りの結果を出力しようとしています。awkは別の番号を使用して一致するフィールドの座標を調整します

値が1でない限り、各ラインの$4一致が最初のマッチングシーケンシャル$6値は、$2に追加された場合、元の$2は(ライン1の場合のように)使用されています。これは新しく調整された$2の値です。

最後に一致するシーケンシャル$6の値が$2に追加され、これは新規または調整済み$3の値です。

新しい$2$3バレスはフォーマット$1$1と組み合わされる:$2から$3$5値は、ライン上に印刷されています。

$4の値が一意である限り、以下のコマンドは有効ですが、必ずしもそうではありません。私は条件 を追加するようには思えません。$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); 
} 

はしかし、それはあなたの要件を理解するために私にかなりの時間を取って、私はまだあなたの希望する出力のなぜ二行目を理解していません94 - 92 == 2からchrX:110956534-110956628 ALG13です。

+0

元の調整されていない '$ 2'座標は' 110956442'なので、 '110956534'の新しい調整済み' $ 2'座標を与えるためにこれに '92'が追加されました。 '94 'は、調整されていない' $ 2'座標に対して '110956536'の新しい調整済み' $ 3'座標を与えることです。ブレーク後の最初の桁が '$ 2 'に追加され、ブレーク前の最後の桁が' $ 2'に追加され、調整された座標が得られます。どうもありがとうございました :)。 – Chris

+0

'awk'は完璧に近いですが、' chrX:110956442-110956535'は '$ 6 == 1'の元の '$ 1'値から' chrX:110956442-110956444 ALG13'に調整されるべきです使用されている。どうもありがとうございました :)。 – Chris

+0

現在は 'chrX:110956443-110956444 \t ALG13'です。調整する行は' first_stop =($ 6 == 1)ですか? 0:$ 6; '、それはそうではないようです。ありがとうございました :)。 – Chris

関連する問題