fastaファイルを解読するawk公式を理解する

fastaファイルを解読するawk公式を理解する

私はfastaファイルを解凍するために使用できる式を見つけました。式を提示する前に、fastaファイルの解凍が何であるかを説明する必要があります。つまり、fasta形式は次のようになります。

>name_of_sequence$
xxxxxxxxxxxxxxxxxxxxxx$
>name_of_sequence_2$
xxxxxxxxxxxxxxxxxxxxxx$
>name_of_sequence_3$
xxxxxxxxxxxxxxxxxxxxxx$

シーケンスごとに1行(xxxxxx ...)しかないため、これは一般的なfastaファイルです。ドル記号は改行文字です。

しかし、時には、あなたは見つけるでしょうパックfastaファイルは次のとおりです。

>name_of_sequence$
xxxxxxxxx$
xxxxxxxxx$
xxxx$
>name_of_sequence_2$
xxxxxxxxx$
xxxxxxxxx$
xxxx$
>name_of_sequence_3$
xxxxxxxxx$
xxxxxxxxx$
xxxx$

これにはまだ3つのシーケンスしかありませんが、各シーケンスは3つの部分に分けられます。 fastaファイルを解凍するとは、後者の形式を電子形式(シーケンスごとに1行)に変換することを意味します。

これを行うには、後者のファイルから改行文字を削除する必要がありますが、すべてではありません。シーケンス名の後に (>name_of_sequence$ など)、シーケンスの末尾 (xxxx$ など) で改行を続ける必要があります。

式は次のとおりです。

cat infasta | awk '/^>/{print s? s"\n"$0:$0;s="";next}{s=s sprintf("%s",$0)}END{if(s)print s}' > outfasta

私の質問は:誰かが私にそれがどのように機能するかを説明できますか?

答え1

これはあなたのawkスクリプトです:

/^>/ {
    print s ? s "\n" $0 : $0;
    s = "";
    next;
}

{
    s = s sprintf("%s", $0);
}

END {
    if (s)
      print s;
}

>最初のブロックは、行が(つまり、fastaヘッダー行)で始まる場合にのみトリガされます。

最初のブロックには何かが印刷されます。それはs ? s "\n" $0 : $0。これは、「sゼロ以外の場合(または設定されていない場合)、改行s文字を使用して追加し、現在の行全体を追加し、そうでない場合は現在の行全体を使用する」ことを意味します。このプログラムでは、s最後に処理されたヘッダー行に属する部分読み取りシーケンスがあり、プログラムがヘッダー行に到達すると、このステートメントはprint最後のシーケンス(現在完了)を出力し、新しく見つかったヘッダーに続きます。新しい回線にあります。

その後、ブロックはs空の文字列に設定され(まだこのヘッダーに属するシーケンスを読み取っていない)、次の入力ラインにジャンプします。

next次のブロックはすべての入力行に対して実行されます(ただし、前のブロックの入力行のためスキップされるため、ヘッダー行では実行されません)。現在行を使用しているs。に追加しますsprintfが、理由はわかりません(うまくいくs = s $0かもしれません)。

すべての入力ラインを読み取った後、最後のブロックが実行されます。最後のヘッダー行(存在する場合)に属するシーケンスを印刷します。

要約:

スクリプトawkはすべての個々のシーケンス行を変数に保存してリンクします。ヘッダ行が見つかると、これまでに読み込んだシーケンスを独自の行の新しいヘッダとともに出力します。最後に、最後のヘッダーに属するシーケンスが出力されます。


awk変数にシーケンスを保存しない代替スクリプト(fastaファイルに非常に大きなゲノムがある場合に便利です):

/^>/ {
    if (NR == 1) {
        print;  # 1st header line, just print it.
    } else {
        # Print a newline for the prev. sequence, then the header line on its own line.
        printf("\n%s\n", $0);
    }
    next; # Skip to next input line.
}

{
    printf("%s", $0); # Print sequence without newline.
}

END {
    printf("\n"); # Add final newline to output.
}

「一行」で:

awk '/^>/{if(NR==1){print}else{printf("\n%s\n",$0)}next} {printf("%s",$0)} END{printf("\n")}' sequence.fasta

答え2

FWIW fastaファイルをラップするための「sed」ベースのソリューションがあります。 sedメソッドの基本的な流れは、シーケンス名の行を見つけた後、最初にその行を独自に表示してから、シーケンス行をパターン空間自体に蓄積し始め、同時に改行を削除することです。このフローは、次のシーケンス名行またはeofに達すると中断されます。

sed -e '
  /^>/{                  # caught sequence name line
     n                   # print seq name, next line into pattern space
     :loop
        N                # read next line into PS, if not print PS/quit
        /\n>/!s/\n//     # join successive sequences
     /\n/!bloop          # go back for more seq if new seq name not got yet
     P;D                 # print the current seq then delete it, branch to the top with PS having new seq name
  }
' your_fasta_file

関連情報