次のように、何百万ものペアを構成するシーケンスを含むファスタファイルがあります。
>7001289F:56:HKH3FBCXX:2:1101:1692:2074 1:N:0:CGATGT
GAGCAGAGGCACCGCTGAGCAGACAGCGAGCGAGTGAAGGGGTCAGGGGCCAGTCAGCAATCTCGTGTAGAAAGAATCACGGTCGAGCGGTGCACGCATG
>NNNNN
GACACCTTCATTTCCACTTTATTGAGCAGCGGCGCATGCGTGCACCGCTCGACCGTGATTCTTTCTACACGAGATTGCTGACTGGCCCCTGACCCCTTCA
>7001289F:56:HKH3FBCXX:2:1101:1522:2186 1:N:0:CGATGT
GTAGATGATGAATACAGCTGTTGCTGCAGCAACTGGTGCTGAGTAAGCAACTGCGATCCATGGACGCATACCTAAACGGAAAGATAATTCCCAC
>NNNNN
GTGGGAATTATCTTTCCGTTTAGGTATGCGTCCATGGATCGCAGTTGCTTACTCAGCACCAGTTGCTGCAGCAACAGCTGTATTCATCATCTAC
次のようにフォーマットする必要があります。
>7001289F:56:HKH3FBCXX:2:1101:1692:2074 1:N:0:CGATGT
GAGCAGAGGCACCGCTGAGCAGACAGCGAGCGAGTGAAGGGGTCAGGGGCCAGTCAGCAATCTCGTGTAGAAAGAATCACGGTCGAGCGGTGCACGCATGNNNNNGACACCTTCATTTCCACTTTATTGAGCAGCGGCGCATGCGTGCACCGCTCGACCGTGATTCTTTCTACACGAGATTGCTGACTGGCCCCTGACCCCTTCA
>7001289F:56:HKH3FBCXX:2:1101:1522:2186 1:N:0:CGATGT
GTAGATGATGAATACAGCTGTTGCTGCAGCAACTGGTGCTGAGTAAGCAACTGCGATCCATGGACGCATACCTAAACGGAAAGATAATTCCCACNNNNNGTGGGAATTATCTTTCCGTTTAGGTATGCGTCCATGGATCGCAGTTGCTTACTCAGCACCAGTTGCTGCAGCAACAGCTGTATTCATCATCTAC
基本的に、複雑なヘッダーはDNA配列の順方向読み取りを表し、NNNNNNヘッダーと一緒に対応する逆方向読み取りを表すヘッダーが続きます。これらの逆方向読み取りをNNNNNでのみ区切られた順方向読み取りに追加する必要がありますが、sedで改行を削除することは困難です。誰でもこれを説明できますか?
答え1
ファイルがメモリに入るのに十分小さい場合は、次のことができます。
perl -00pe 's/\n>(NNNNN)\n/$1/g' file
ファイルがRAMにロードするには大きすぎるため、次のコマンドを使用できます。
$ perl -pe '$c++; if($c==2){chomp}
elsif($c==3){s/[>\n]//g;}
elsif($c==4){$c=0}' file.fa
>7001289F:56:HKH3FBCXX:2:1101:1692:2074 1:N:0:CGATGT
GAGCAGAGGCACCGCTGAGCAGACAGCGAGCGAGTGAAGGGGTCAGGGGCCAGTCAGCAATCTCGTGTAGAAAGAATCACGGTCGAGCGGTGCACGCATGNNNNNGACACCTTCATTTCCACTTTATTGAGCAGCGGCGCATGCGTGCACCGCTCGACCGTGATTCTTTCTACACGAGATTGCTGACTGGCCCCTGACCCCTTCA
>7001289F:56:HKH3FBCXX:2:1101:1522:2186 1:N:0:CGATGT
GTAGATGATGAATACAGCTGTTGCTGCAGCAACTGGTGCTGAGTAAGCAACTGCGATCCATGGACGCATACCTAAACGGAAAGATAATTCCCACNNNNNGTGGGAATTATCTTTCCGTTTAGGTATGCGTCCATGGATCGCAGTTGCTTACTCAGCACCAGTTGCTGCAGCAACAGCTGTATTCATCATCTAC
説明する
perl -pe '...' file.fa
: 入力ファイルの各行に対して、指定されたfile.fa
スクリプトを実行してリントします。-e
-p
$c++
:変数を1行に1つずつ増やします$c
。if($c==2){chomp}
$c
:現在の値がある場合は、行末の2
改行を削除します。これは順方向シーケンスの行と一致します。elsif($c==3){s/[>\n]//g;}
:$c
その場合は、改行3
文字を>NNNNN
削除してください。>
elsif($c==4){$c=0}'
:$c
その場合は4
リセットしてください0
。
これはペアの読み込みを想定しています。ファイル内のすべての順方向読み取りに対して正確に1つの逆方向読み取りがないと失敗します。また、シーケンスが一行にあると仮定します。 Fastaファイルは通常、シーケンスごとに複数行で構成され、デフォルトでは60文字に切り捨てられます。これは近年変更されていますが、フォーマットはまだ複数のシーケンスを受け入れます。