固定されていない間隔の定義された長さに基づいて開始座標と終了座標を抽出する

固定されていない間隔の定義された長さに基づいて開始座標と終了座標を抽出する

「開始」列で始まり、「終了」列で終わる間隔を持つファイルがあります。 4番目の列に書き込まれた定義された長さに基づいて、これらの間隔の開始と終了を抽出する必要があります。また、「スコア」列の情報を印刷する必要があります。ファイルは次のようになります。

Input:  
chr     start   end     score  length  
chr1    237592  237601  176    320
chr1    237601  237912  176    320
chr1    521409  521601  150    320  
chr1    521601  521729  150    320
chr1    714026  714346  83     320 
chr1    805100  805201  323    340
chr1    805201  805440  323    340


Output:
chr     start   end     score  length  
chr1    237592  237912  176    320
chr1    521409  521729  150    320 
chr1    714026  714346  83     320
chr1    805100  805440  323    340 

ご覧のとおり、抽出する間隔の長さは5番目の列にあります。たとえば、間隔の長さを出力します。

chr1    237592  237912

これは、237912(「To」列の2行目)から237592(「Start」列の最初の行)を引くことによって得られます。これは320(列5で定義されています)です。

どんなアイデアにも感謝します。

ベストアンサー1

緩く言うと、問題はマージラインです。線の開始座標が前の線の終点座標と等しい場合、線は前の線と「マージ」することができます。

このラインはゲノムの特徴に対応し得る。目的は、ゲノム配列内の隣接する特徴をマージすることである。

awkこれを行うスクリプトは次のとおりです。

$2 == end {
    # This line merges with the previous line.
    # Update end and continue with next line.

    end = $3;
    next;
}

{
    # This is an unmergeable line (start doesn't correspond to end on
    # previous line).

    # If we've processed at least the header line, print the data collected.
    # The if statement avoids printing an empty output line at the 
    # start of the output.

    if (NR > 1) {
        print chr, start, end, score, len;
    }

    # Get data from this line.

    chr = $1;
    start = $2;
    end = $3;
    score = $4;
    len = $5;
}

END {
    # At the end of input, print the data as above to output last line.
    print chr, start, end, score, len;
}

スクリプトは、入力が整列しており、すべての開始座標が終了座標よりも厳密に小さいと仮定します(つまり、すべての機能が正のチェーンにある)。

テストしてみてください:

$ awk -f script.awk data
chr start end score length
chr1 237592 237912 176 320
chr1 521409 521729 150 320
chr1 714026 714346 83 320
chr1 805100 805440 323 340

おすすめ記事