用“|”管道(将上一个命令的输出传递到下一个命令)当使用“bsub”时

用“|”管道(将上一个命令的输出传递到下一个命令)当使用“bsub”时

嗨,我想这是一个非常基本的问题:

使用“bsub”时是否有任何特定的语法来执行“管道”?

我这么问是因为当我遇到这样的问题时:

# try to run the same command successfully ran in another host
bsub fastx_trimmer -Q33 -f 1 -l 230 -i myfile.fastq | fastq_quality_trimmer -Q33 -t 18 -l 20 -o Trimmed_file.fastq &

但我遇到了一个错误:

fastq_quality_trimmer: input file (-) has unknown file format (not FASTA or FASTQ), first character = J (74)

第二个命令似乎无法找到第一个命令的输出。

# try to run command without using "|"
bsub fastx_trimmer -Q33 -f 1 -l 230 -i myfile.fastq -o Trimmed_file.fastq
# seemed to work!

bsub fastq_quality_trimmer -Q33 -t 18 -l 20 -i Trimmed_file.fastq -o Trimme_file2.fastq &
# Also seemed to work!

# try to pipe again, did not work...
bsub fastx_trimmer -Q33 -f 1 -l 230 -i myfile.fastq | fastq_quality_trimmer -Q33 -t 18 -l 20 -o Trimme_file2.fastq &

# when call command without bsub, it seemed to work. 
fastx_trimmer -Q33 -f 1 -l 230 -i myfile.fastq | fastq_quality_trimmer -Q33 -t 18 -l 20 -o Trimme_file2.fastq &
# so the issue seemed to be "bsub"

我想使用bsub,因为我的主机正在使用gate节点(之前的主机没有gate节点,所以我是否使用“bsub”并不重要),并且我不想通过运行来创建“交通拥堵”门节点中的命令。有什么建议吗?

答案1

如果提交成功,该bsub命令将输出作业提交ID和已提交的队列名称。

bsub不会为您提供 的输出fastx_trimmer,这意味着它不能用于fastq_quality_trimmer通过管道直接输入。

您需要将整个管道提交到队列中以使其正常工作,方法是将命令放入 shell 脚本中并提交(理想情况下,如果您计划运行多次),或者通过在中正确引用整个管道致电bsub.

答案2

我通过电子邮件收到了朋友的建议。两种解决方法: 1.将真正的命令放在“”中。

bsub "fastx_trimmer -Q33 -f 1 -l 230 -i myfile.fastq | fastq_quality_trimmer -Q33 -t 18 -l 20 -o Trimmed_file.fastq”
  1. 为 bsub 编写 bash 脚本。

我尝试了解决方案1。效果很好。把它放在这里以防其他人有类似的问题。

答案3

我没有足够的资金来使用您的示例中提到的特定程序进行测试。

然而,你所要求的可以通过-I(破折号大写字母)选项来实现bsub。唯一的问题是作业提交消息也被发送到标准输出,这将与预期的混合在一起实际的程序的输出:

Job <123456> is submitted to default queue <normal>.

这似乎是 LSF 中的一个错误(应该转到 stderr)。解决方法礼貌这个答案是:

BSUB_QUIET=1 bsub -I cmd-that-writes-to-stdout | cmd-that-reads-from-stdin

请注意,环境变量的实际值BSUB_QUIET显然并不重要;它只需要是定义的在环境中。

对于一次性命令,您可以将一个命令的输出通过管道传输bsub -I到另一个命令中bsub -I,没有问题:

$ export BSUB_QUIET=1

$ bsub -I grep ^root /etc/passwd
root:x:0:0:root:/root:/bin/bash

$ bsub -I grep ^root /etc/passwd | bsub -I awk -F: '{print \$6}'
/root

$但是,如果它们出现在命令中的某个位置,则必须小心引用或转义 shell 元字符,例如, 。正如其他人所建议的那样,这是简单使用独立脚本的另一个很好的理由。

希望有帮助。

相关内容