私は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