0

awk を使用して必要なフィールド (ヘッダーを含むシーケンス) を抽出するファイル (fasta) があります。それを BLAST プログラムにパイプし、最後にジョブを送信するために qsub にパイプします。ファイル:

>sequence_1
ACTGACTGACTGACTG
>sequence_2
ACTGGTCAGTCAGTAA
>sequence_3
CCGTTGAGTAGAAGAA

およびコマンド(動作します):

awk < fasta.fasta '/^>/ { print $0 } $0 !~ /^>/' | echo "/Local/ncbi-blast-2.2.25+/bin/blastx -db blastdb.fa -outfmt 5 >> /User/blastresult.xml" | qsun -q S

私がやりたいことは、ジョブが送信される特定のしきい値を下回っている場合に、実行中のジョブの数を (qstat を使用して) サンプリングする条件を追加することです。例えば:

allowed_jobs=200 #for example 
awk < fasta.fasta '/^>/ { print $0 } $0 !~ /^>/' | echo "/Local/ncbi-blast-2.2.25+/bin/blastx -db blastdb.fa -outfmt 5 >> /User/blastresult.xml" | cmd=$(qstat -u User | grep -c ".") | if [ $cmd -lt $allowed_jobs ]; then  qsub -q S

残念ながら(とにかく私にとって)私はそれをしようとするすべての試みに失敗しました。どんな助けにも感謝します

編集:少し詳しく説明します:私がやろうとしているのは、fastaファイルからこれを抽出することです:

>sequene_x
ACTATATATATA

または基本的に: >HEADER\nSEQUENCE 1 つずつ、stdin を取ることができる blast プログラムにパイプします。シーケンスごとに一意のジョブを作成したいので、シーケンスごとに qsub にパイプする必要があります。簡単に言うと、qsub の送信は次のようになります。

qsub -q S /Local/ncbi-blast-2.2.25+/bin/blastx -db blastdb.fa -query FASTA_SEQUENCE -outfmt 5 >> /User/blastresult.xml

stdin シーケンスがパイプされている場合、-query フラグは不要であることに注意してください。ただし、私にとっての主な問題は、qstat の結果がしきい値を下回った場合にのみシーケンスが qsub にパイプされるように、上記の条件を組み込む方法です。理想的には、qstat の結果がしきい値を超えている場合は、i が下回るまでスリープ状態になり、それを前方に渡します。

ありがとう。

4

2 に答える 2

2

こんにちは、これはずっと前から答えられていると思います。

awk に渡す前に処理する必要がある行 (シーケンス) をカウントすることで、これを解決する方法を提供します

#!/bin/bash
ct=`grep -c '^>' fasta.fasta`
if [ $ct -lt 201 ] ; then 
    echo time to work
else
    echo too much
fi
于 2012-12-21T02:59:28.667 に答える
0

このシェルのビットは 2 行を読み取り、それらを stdout に出力し、qsub コマンドにパイプします。

while IFS= read -r header; do
    IFS= read -r sequence
    printf "%s\n" "$header" "$sequence" | 
    qsub -q S /Local/ncbi-blast-2.2.25+/bin/blastx -db blastdb.fa -outfmt 5 >> /User/blastresult.xml
done < fasta.fasta
于 2012-11-13T19:57:03.230 に答える