特定の連続文字、発生位置、長さの計算

特定の連続文字、発生位置、長さの計算

シーケンスファイルがあり、連続する文字「N」の数とその文字の発生位置と長さを計算しようとしています。mySequence.fastaファイル名は次のとおりです。

>sequence-1
ATCGCTAGCATNNNNNNNNNNNNNNCTAGCATCATGCNNNNNNATACGCATCACANNNNNNNNNCgcatATCAC

期待される出力は次のようになります。

Position 12 N 14
Position 38 N 6
Position 56 N 9

awksed私のファイル名を提供または提供してこの問題を解決するのに役立ちます。mySequence.fasta

答え1

これに非常に便利なawk設定match()RSTART変数を使用してこれを行うことができます。RLENGTH

<mySequence.fasta awk -v C=N '{
  i=0
  while (match($0, C "+")) {
    printf "Position %d %s %d\n", i+RSTART, C, RLENGTH
    i += RSTART+RLENGTH-1
    $0 = substr($0, RSTART+RLENGTH)
  }}'

または と配列をperl使用して、試合の開始と終了を記録します。@-@+

perl -ne 'printf "Position %d N %d\n", $-[0]+1, $+[0]-$-[0] while /N+/g'

もう少し高速な別の方法(少なくとも私のバージョンではperlperlは(実験的(?{...})正規表現演算子:

perl -ne '0 while /N(?{$s=pos})N*(?{printf "Position %d N %s\n", $s, pos()-$s+1})/g'

答え2

別のawk解決策:

awk -F '' '{for(i=1;i<=NF;i++){ if($i=="N"&&!sPOS) sPOS=i;
   if (i==NF &&sPOS && $NF=="N"){LN++}; if($i=="N" &&sPOS && i<NF) {LN++}
   else if(sPOS) {printf("Position %d N %d\n", sPOS, LN); LN=sPOS=0} }
}' infile.txt

すべてのawk実装は空のFS()をサポートしていないため、互換性の-F ''ために変更されたスクリプトは次のとおりです。

awk -F'N' '{sPOS=0;for(i=2;i<=NF;i++){ if($i==""&&!sPOS) sPOS=(i-1)+length($(i-1));
    if($i=="" &&sPOS && NF!=i) {LN++} 
    else if(sPOS) {printf("Position %d N %d\n", sPOS, ++LN); sPOS+=LN+length($i); LN=0} }
}' infile.txt

入力例:

>sequence-1
ATCGCTAGCATNNNNNNNNNNNNNNCTAGCATCATGCNNNNNNATACGCATCACANNNNNNNNNCgcatATCACNN
N
AN
NNA

結果:

Position 12 N 14
Position 38 N 6
Position 56 N 9
Position 75 N 2
Position 1 N 1
Position 2 N 1
Position 1 N 2

関連情報