如何使用awk和条件管道提交qsub作业?

时间:2012-11-13 12:50:30

标签: bash awk pipe fasta qsub

我有一个文件(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

或基本上:&gt; 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

请注意,如果将stdin序列传送给它,则不需要-query标志。 然而,对我来说主要的问题是如何结合我上面提到的条件,以便只有当qstat结果低于阈值时才将序列传送到qsub。理想情况下,如果qstat结果高于阈值,它将一直睡到我向下,然后向前传递。

感谢。

2 个答案:

答案 0 :(得分:2)

您好我想这个问题已经回答了很长时间。

我只是提供一种方法来解决这个问题,通过计算应该处理的行(序列)然后将其传递给awk,awk片段会去回显时间工作

#!/bin/bash
ct=`grep -c '^>' fasta.fasta`
if [ $ct -lt 201 ] ; then 
    echo time to work
else
    echo too much
fi

答案 1 :(得分: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