シーケンスの任意の位置でC / Tの最長連続パターンと中央でC / Tの最長連続パターンを計算する方法
CCCCTGTTGCCAAACAATGC
TTTTCCCGCCTTGGCCTAC
TACACGGAACCTCTTTTTTTA
目的の出力は、シーケンスのどこでもC / Tの最長連続パターンと中央で始まるC / Tの最長連続パターンを計算することです。
CCCCTGTTGCCAAACAATGC5 2
TTTTCCCGCCTTGGCCTAC7 5
TACACGGAACCTCTTTTTTTA10 10
最初の行には、5つの連続したC / Tパターンが順番にあり、中央で最も長いC / Tパターンは2つです。
PS。同様の問題に対する解決策はここにあります。 最長連続パターンの計算
答え1
「中央で」という語は、「文字列の中間文字を含むシーケンス」を意味すると仮定する。文字列の中間文字がCでもTでもないように、テストデータに1行を追加しました。
$ cat file
CCCCTGTTGCCAAACAATGC
TTTTCCCGCCTTTGGCCTAC
TACACGGAACCTCTTTTTTA
CATAAAAAAAAAAAAACTCT
解決策は、パターンに一致するmatch()関数の副産物として設定されるawkのRSTART変数とRLENGTH変数と、文字列内の現在の位置を追跡するいくつかのアルゴリズムに依存します。
awk '{
line = $0
max = max_ctr = 0
mid = int(length($0)/2)
idx = 1
while (match( substr(line,idx), /[CT]+/ )) {
if (RLENGTH > max) max = RLENGTH
if (idx <= mid && mid <= idx+RLENGTH) max_ctr = RLENGTH
idx += RSTART + RLENGTH - 1
}
print $0, max, max_ctr
}' file
出力
CCCCTGTTGCCAAACAATGC 5 2
TTTTCCCGCCTTTGGCCTAC 7 5
TACACGGAACCTCTTTTTTA 10 10
CATAAAAAAAAAAAAACTCT 4 0
答え2
「中心から」が「中心に最も近いが必ずしも通過する必要はない最も長い文字列」を意味する場合は、試してみることができます。
awk '
{MID = int(length()/2);
MX = PTR = 0
T0 = $0
while (match ($0, /[CcTt]+/)) {if (RLENGTH > MX) MX = RLENGTH
SSTR = PTR + RSTART
SEND = SSTR + RLENGTH - 1
TMPS = SSTR - MID
TMPE = MID - SEND
if (SEND < MID) {P = TMPE; RES = RLENGTH}
else {if (SSTR <= MID) {P = 0; RES = RLENGTH}
else if ((P > TMPS) ||
(P == TMPS) && (RLENGTH > RES)) {P = TMPS; RES = RLENGTH}
}
PTR = SEND
$0 = substr ($0, RSTART + RLENGTH)
}
print T0, MX, RES
}
' file
正規表現から正規表現が一致する行まで繰り返し、ポインタを保持して元の行の位置を保存します。これにより、文字列の終わりから中心まで、または中心から文字列の先頭までの文字距離を計算し、最小距離の文字列長を結果変数に割り当てます。同じ距離の場合、最長の長さを維持します。
中心を通るパターンの場合、結果は以前に提供されたサンプルと同じです。