0

我有一个文件(fasta),我正在使用 awk 从(带有标题的序列)中提取所需的字段。然后我通过管道将其传输到 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 一个接一个,并将其通过管道传输到可以采用标准输入的爆炸程序。我想为每个序列创建一个独特的作业,这就是我想为每个序列管道到 qsub 的原因。说白了,qsub 提交看起来像这样:

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

请注意,如果标准输入序列通过管道传递给它,则 -query 标志是不必要的。但是,对我来说主要的问题是如何结合我上面提到的条件,以便仅当 qstat 结果低于阈值时,序列才会被传送到 qsub。理想情况下,如果 qstat 结果高于阈值,它将休眠直到 i 低于阈值,然后将其向前传递。

谢谢。

4

2 回答 2

2

您好,我想这已经很久了。

我将提供一种解决此问题的方法,通过在将其传递给 awk 之前计算应处理的行(序列),awk 片段将在echo time 工作的地方进行。

#!/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

这段 shell 读取两行,将它们打印到 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 回答