「開始」列で始まり、「終了」列で終わる間隔を持つファイルがあります。 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
答え2
私にとって、これはスペースで区切られた列を持つテキストファイルのようです。これは正常に処理できますが、R
シェルスクリプトもこれを実行できます。必要なのは、ループを使用してファイルを1行ずつ読み込むことですfor
。ループ内の簡単なアプローチは、cut
各列値(使用可能)を変数に割り当ててから、必要な順序で変数を印刷することです。 2番目と5番目の列変数が一緒に追加され、3番目の出力列が生成されます。echo
forループを使用して各出力行を画面に印刷できます。画面に目的の行が印刷されたら、単純にスクリプト出力を次のファイルにリダイレクトできます。your_script.sh > your new output.txt