"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)

2番目のコマンドは、最初のコマンドの出力が見つからないようです。

# 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を使用したいと思います(以前のホストにはゲートノードがなかったため、「bsub」を使用するかどうかは重要ではありません)。ゲートノードでコマンドを実行して「交通渋滞」を発生させます。どんな提案がありますか?

答え1

送信が成功すると、bsubコマンドはジョブ送信IDと送信されたキュー名を出力します。

bsub出力を提供しません。つまり、パイプを介した直接入力fastx_trimmerには使用できません。fastq_quality_trimmer

これがうまく機能するには、コマンドをシェルスクリプトに入れて送信するか(理想的には複数回実行する予定の場合)、パイプライン全体をキューに正しく引用して送信する必要があります。呼ぶbsub

答え2

メールで友達から提案を受けました。 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。唯一の問題は、ジョブ送信メッセージがstdoutにも送信され、予想されるメッセージと混在することです。実際プログラム出力:

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明らかに重要ではありません。限られた環境で。

ワンタイムコマンドでは、問題なく1つのコマンドの出力を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

あなた会議$ただし、シェルメタ文字(コマンドのどこかに表示される場合)を引用またはエスケープするときは注意が必要です。他の人が提案したように、これは単にスタンドアロンスクリプトを使用するもう一つの良い理由です。

お役に立てば幸いです。

関連情報