2016-06-19 23 views
-2

これは、シーケンスの先頭または最後にあることを考慮して、fasta(アライメント)ファイルでchar(n)の繰り返しを数える方法を見つけようとします。シーケンス内の文字を無視する。fasta(アライメント)ファイルの文字数をカウントする

例:

入力:

>chromosome1 
============ 
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn 
TGTGAAGATGCTGGAGGAAACAGGTAnnCAAAAGTATCTATATCCACAGTAAAACAAGTCCTATATTGACAT 
CCTGAAAGGCCTCTCAGCAAGGAAGAAGCCACTGCTCCAAAACCGCCAnnnTAAAAAAGCCAGACTACGGTT 
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn. 

出力

71 
74 

この時点で私は

awk '{print gsub (srch,srch)}' srch="n" 
とシーケンス全体にどのように多くの文字(n)をカウントすることができます

しかし、私はIDが必要ですea(コード)を使用して、大ブロックの前後の2つのグループを区別します。

+1

[編集]あなたの質問あなたの投稿をサンプル入力与えられた期待される出力を含めます。 –

答えて

0

は、あなたが次の012前>headerと最後の行の後の最初の行をしたい場合またはファイルの終わり、

awk '/^>/ { if (FNR>1) print n; n=0; p=1; next } 
{ n=gsub("n", "n") } 
p { print n; p=0 } 
END { print n }' file.fasta 

のようなものを試してみてください(私は============ラインが実際にあなたのデータの一部ではないと想定している。)

+0

ありがとう。それが私が探していたものです。 – Babi

+0

[ヘルプ]に概説されているように、upvotingと/または受け入れを検討してください。 http://stackoverflow.com/help/someone-answers – tripleee

0

awkだけで、次のスクリプトを使用できます。それは最後にsrchとプリントのすべての配列の長見つかった最初と最後のシーケンスの長さをカウントします。

# count.awk 
BEGIN { 
    FS="" 
    n=0 
} 

NR > 2 { 
    for(i=1; i<=NF; i++) { 
     # Increment current group if current character equals srch 
     if($i == srch) { 
      grp[n]++ 
     } else { 
      # Next group 
      n++ 
      # Next character 
      i++ 
      # Iterate trough line until next sequence of srch 
      while($i != srch && i <= NF) { 
       i++ 
       # The next sequence starts 
       if ($i == srch) { 
        grp[n]++ 
        break 
       } 
      } 
     } 
    } 
} 
END { 
    print "Begin: ", grp[0] 
    print "End: ", grp[n-1] 
} 

はこのようにそれを呼び出す:

awk -v srch=n -f count.awk input.fasta 
+0

ありがとうhek2mgl、しかし、私はファイル内のnの全体の数の結果を望んでいません。私は、最初に来るものと終わりのものとを分ける必要があります。また、それはブロック内にあることを無視しています。 – Babi

+0

@Babi最初の 'n'は常に最初の行にあり、最後の' n'は常に最後の行にありますか? – hek2mgl

+0

いいえ、この例の場合だけです。他のファイルでは、異なる数のnを持ち、1行以上の長さにすることができます。私はまた、ファイルを1行に変換し、nの後に改行を挿入することも考えましたが、これにはブロックの小さな結果も含まれます。 – Babi

0

私はこの質問はかなり曖昧見つけ、しかし、このawkスクリプトが役立つかもしれない:

/^n+\.$/ { print "after: " length($0) - 1; next; } 
/^n+$/ { print "before: " length($0) } 
関連する問題