for ループは、単一のコマンドで親ファイルの複数のテキストを複数のファイルにインポートします。

for ループは、単一のコマンドで親ファイルの複数のテキストを複数のファイルにインポートします。

私は遺伝子に基づいて配列を命名し保存する29のfastaファイル(拡張子.fa)を持っています。

(例:リボソームタンパク質L1、リボソームタンパク質L6P / L9E、...)

この29個のファスタファイルには合計722種類があります。各配列の最初の行には対応する遺伝子と種名が表示され、2番目の行には対応する配列が表示されます。

1種は1つ以上の遺伝子配列を持っています。

遺伝子に基づいてソートされた29個のfastaファイルから722種を別々の722個のファイルに移動したいと思います(遺伝子の代わりに種によってソート)。

親ファイルの種名は角かっこで囲まれています[ ]

forループを使用して722個のファイルを抽出し、シーケンス名に基づいてファイル名を指定するには?

次の例Ribosomal Protein L1.fa:

>gi|103486926|ref|YP_616487.1| 50S ribosomal protein L1 [Sphingopyxis alaskensis RB2256]
MAKLTKKQKALEGKVDAQKLHGVDEAIKLVRELATAKFDETLEIAMNLGVDPRHADQMVRGVVTLPAGTGKDVKVAVFAR

次の例Ribosomal Protein L6PL9E.fa:

>gi|410479108|ref|YP_006766745.1| ribosomal protein L6P/L9E [Leptospirillum ferriphilum ML-04]
MGFTHTVEFTLPSLIKASIEKQTIITLSSPDKELLGQFAADVRSIRPPEPYKGKGIKYSGEKILRKEGKTGKK

最初の例として、

種名: Sphingopyxis alaskensis RB2256

遺伝子配列:MAKLTKKQKALEGKVDAQKLHGVDEAIKLVRELATAKFDETLEIAMNLGVDPRHADQMVRGVVTLPAGTGKDVKVAVFA

ファイル名を指定Sphingopyxis alaskensis RB2256.faし、その種名を持つすべてのシーケンスをファイルに挿入したいと思います。

これを行うためにbashシェルを使用しています。grepタスクを完了するために使用できます。

grep -A+1 "Sphingopyxis alaskensis RB2256" *.fa >> Sphingopyxis alaskensis RB2256.fa

ところで、種別で順序を並べ替えるには、722番をする必要があります。

forループのgrepを使って作業を簡素化できますか?それとも別の方法がありますか?

答え1

Fasta形式では、すべてのシーケンスが1行にある必要はありません。実際、ほとんどの生物学的配列は非常に長いので、これは一般的ではありません。したがって、grepIDシーケンスが1行を超えると、いずれの場合も失敗します。また、コマンドはという名前のファイルではなく名前のgrepファイルを生成します。SphingopyxisSphingopyxis alaskensis RB2256.fa

とにかく、各シーケンスを種の後ろにファイル名に入れて、次のようにすることができます。

awk -F'[][]' '/>/{n=$2}; {print >> n".fa"}' *.fa 

ただし、ファイル名にスペースを使用しないことをお勧めします。スペースを使用すると、作業が難しくなります。より安全なアプローチは次のとおりです。

awk -F'[][]' '/>/{n=$2; gsub(/ /,"_",n)}; {print >> n".fa"}' *.fa 

gsub種名のすべてのスペースを置き換えると、_次のファイルが生成されます。

Leptospirillum_ferriphilum_ML-04.fa  Sphingopyxis_alaskensis_RB2256.fa

上記の両方の方法は、複数行のシーケンスを処理できます。

関連情報