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

Bash 如何使用awk和条件管道提交qsub作业?,bash,awk,pipe,fasta,qsub,Bash,Awk,Pipe,Fasta,Qsub,我有一个文件(fasta),我正在使用awk从中提取所需的字段(带有标题的序列)。然后我将其传输到BLAST程序,最后我将其传输到qsub以提交作业。 文件: >sequence_1 ACTGACTGACTGACTG >sequence_2 ACTGGTCAGTCAGTAA >sequence_3 CCGTTGAGTAGAAGAA 以及命令(该命令有效): 或基本上:>标题\n顺序 一个接一个地将其传送到blast程序,该程序可以接受stdin。我想为每个序列创建一个唯一的作

我有一个文件(fasta),我正在使用awk从中提取所需的字段(带有标题的序列)。然后我将其传输到BLAST程序,最后我将其传输到qsub以提交作业。 文件:

>sequence_1
ACTGACTGACTGACTG
>sequence_2
ACTGGTCAGTCAGTAA
>sequence_3
CCGTTGAGTAGAAGAA
以及命令(该命令有效):

或基本上:>标题\n顺序 一个接一个地将其传送到blast程序,该程序可以接受stdin。我想为每个序列创建一个唯一的作业,这就是我想为每个序列管道到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标志,则不需要-query标志。 然而,对于我来说,主要的问题是如何合并我上面提到的条件,以便只有当qstat结果低于阈值时,序列才会通过管道传输到qsub。理想情况下,如果qstat结果高于阈值,它将休眠,直到我低于阈值,然后将其转发


谢谢。

这个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
而IFS=read-r报头;做
IFS=读取-r序列
printf“%s\n”$header“$sequence”|
qsub-qs/Local/ncbi-blast-2.2.25+/bin/blastx-db blastdb.fa-outfmt 5>>/User/blastresult.xml
完成

您好,我想这是很久以前的问题了

我将提供一种解决方法,在将其传递给awk之前,通过计算应该处理的行(序列),awk片段将到达回波工作时间的位置

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

如果
qsub
在后台运行,您就不能用
ps ax | grep-wc'[q]sub'
计算进程数吗?或者,与其不运行作业,不如将它们提交到队列,然后编写一个队列运行程序,在前200个作业上生成
qsub
,然后在旧作业完成时生成新实例?当然,这将是一个完全不同的问题。您的第一个awk调用不会进行过滤:它会像cat一样打印整个文件。事实上,您的awk命令的输出根本不被使用:echo命令不从标准输入(本例中为管道)获取输入。也许,你可以告诉我们你想要完成什么:输入看起来像什么,输出应该是什么。@HaiVu我已经补充了一些关于上述问题的更多信息。谢谢,谢谢你。但是,我的问题是,我在向管道添加条件时遇到问题,该条件将检查用户正在运行的作业数,并且只有在低于阈值时才会将命令传递给qsub。感谢您的尝试。然而,这不是我的问题。我正在寻找一种方法,发送序列上的一个爆炸与qsub。你的回答没有提到这一点。
qsub -q S /Local/ncbi-blast-2.2.25+/bin/blastx -db blastdb.fa -query FASTA_SEQUENCE -outfmt 5 >> /User/blastresult.xml
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
#!/bin/bash
ct=`grep -c '^>' fasta.fasta`
if [ $ct -lt 201 ] ; then 
    echo time to work
else
    echo too much
fi