端末でコマンドを実行してクラスタに送信しようとすると、他の結果が表示されます。
端末に次のように入力した場合:
$ for i in *_1.fastq.gz; do echo $i >> t.txt; zcat $i | \
grep "GCTGGCAAAAAGAAGGTAACATGTTTT" >> t.txt ; echo >> t.txt ; done
私はこのように出力されます
adrenal_4a_ERR315335_1.fastq.gz
GCANAGGCCAATGTTGGTGCTGGCAAAAAGAAGGTAACATGTTTTAAGGAACTATGTAGCATAGTGTCTTAACACCTCAGTAAAGAGATCGGAAGAGCACA
adrenal_4a_ERR315452_1.fastq.gz
GCAAAGGCCAATGTTGGTGCTGGCAAAAAGAAGGTAACATGTTTTAAGGAACTATGTAGCATAGTGTCTTAACACCTCAGTAAAGAGATCGGAAGAGCACA
CAAGAACAGAATGAAGAAAGTCAGGGGGACTGCAAAGGCCAATGTTGGTGCTGGCAAAAAGAAGGTAACATGTTTTAAGAAACTATGTAGCATAGTGTCTT
adrenal_4c_ERR315392_1.fastq.gz
adrenal_4c_ERR315450_1.fastq.gz
and so on..
これは予想される結果です。
HPCクラスタに同じコマンドを送信すると、qsub
まったく異なる結果が表示されます。
$ qsub -l h_vmem=4G -cwd -j y -b y -N n_tr -R y \
"for i in *_1.fastq.gz; do echo $i >> t.txt; zcat $i | \
grep "GCTGGCAAAAAGAAGGTAACATGTTTT" >> t.txt ; echo >> t.txt ; done"
adrenal_4a_ERR315452_1.fastq.gz
GCAAAGGCCAATGTTGGTGCTGGCAAAAAGAAGGTAACATGTTTTAAGGAACTATGTAGCATAGTGTCTTAACACCTCAGTAAAGAGATCGGAAGAGCACA
CAAGAACAGAATGAAGAAAGTCAGGGGGACTGCAAAGGCCAATGTTGGTGCTGGCAAAAAGAAGGTAACATGTTTTAAGAAACTATGTAGCATAGTGTCTT
adrenal_4a_ERR315452_1.fastq.gz
appendix_4a_ERR315437_1.fastq.gz
GCAAAGGCCAATGTTGGTGCTGGCAAAAAGAAGGTAACATGTTTTAAGGAACTATGTAGCATAGTGTCTTAACACCTCAGTAAAGAGATCGGAAGAGCACA
CAAGAACAGAATGAAGAAAGTCAGGGGGACTGCAAAGGCCAATGTTGGTGCTGGCAAAAAGAAGGTAACATGTTTTAAGAAACTATGTAGCATAGTGTCTT
adrenal_4a_ERR315452_1.fastq.gz
GCAAAGGCCAATGTTGGTGCTGGCAAAAAGAAGGTAACATGTTTTAAGGAACTATGTAGCATAGTGTCTTAACACCTCAGTAAAGAGATCGGAAGAGCACA
CAAGAACAGAATGAAGAAAGTCAGGGGGACTGCAAAGGCCAATGTTGGTGCTGGCAAAAAGAAGGTAACATGTTTTAAGAAACTATGTAGCATAGTGTCTT
adrenal_4a_ERR315452_1.fastq.gz
GGACTGCAAAGGCCAATGTTGGTGCTGGCAAAAAGAAGGTAACATGTTTTAAGAAACTATGTAGCATAGTGTCTTAACACCTCAGTAAAGAGATCGGAAGA
appendix_4a_ERR315465_1.fastq.gz
GCAAAGGCCAATGTTGGTGCTGGCAAAAAGAAGGTAACATGTTTTAAGGAACTATGTAGCATAGTGTCTTAACACCTCAGTAAAGAGATCGGAAGAGCACA
CAAGAACAGAATGAAGAAAGTCAGGGGGACTGCAAAGGCCAATGTTGGTGCTGGCAAAAAGAAGGTAACATGTTTTAAGAAACTATGTAGCATAGTGTCTT
adrenal_4a_ERR315452_1.fastq.gz
appendix_4b_ERR315345_1.fastq.gz
GCAAAGGCCAATGTTGGTGCTGGCAAAAAGAAGGTAACATGTTTTAAGGAACTATGTAGCATAGTGTCTTAACACCTCAGTAAAGAGATCGGAAGAGCACA
CAAGAACAGAATGAAGAAAGTCAGGGGGACTGCAAAGGCCAATGTTGGTGCTGGCAAAAAGAAGGTAACATGTTTTAAGAAACTATGTAGCATAGTGTCTT
adrenal_4a_ERR315452_1.fastq.gz
GCAAAGGCCAATGTTGGTGCTGGCAAAAAGAAGGTAACATGTTTTAAGGAACTATGTAGCATAGTGTCTTAACACCTCAGTAAAGAGATCGGAAGAGCACA
CAAGAACAGAATGAAGAAAGTCAGGGGGACTGCAAAGGCCAATGTTGGTGCTGGCAAAAAGAAGGTAACATGTTTTAAGAAACTATGTAGCATAGTGTCTT
私がここで何を間違っているのか?
答え1
コマンドに無効な引用符が使用されました。
二重引用符("..."
)を使用すると、シェルは変数(たとえば)を評価できます$i
。すでに変数を使用していて値が保持されているadrenal_4a_ERR315452_1.fastq.gz
ため、qsub
次のことが実行されていることがわかります。
for i in *_1.fastq.gz; do echo adrenal_4a_ERR315452_1.fastq.gz >> t.txt; zcat adrenal_4a_ERR315452_1.fastq.gz | grep GCTGGCAAAAAGAAGGTAACATGTTTT >> t.txt ; echo >> t.txt ; done
一番外側の引用符を一重引用符('...'
)に変更すると、期待どおりに機能します。
qsub -l h_vmem=4G -cwd -j y -b y -N n_tr -R y 'for i in *_1.fastq.gz; do echo $i >> t.txt; zcat $i | grep "GCTGGCAAAAAGAAGGTAACATGTTTT" >> t.txt ; echo >> t.txt ; done'
答え2
この試み:
$ qsub -l h_vmem=4G -cwd -j y -b y -N n_tr -R y \
'for i in *_1.fastq.gz; do echo $i >> t.txt; zcat $i | \
grep "GCTGGCAAAAAGAAGGTAACATGTTTT" >> t.txt ; echo >> t.txt ; done'
違いは見えますか?
二重引用符( ")を一重引用符( ")に変更しました。
'for i in ....t.txt ; done'
^^^ ^^^
これにより、ローカルシェル拡張内のすべてのものから保護されます。二重引用符を使用すると、*_1.fastq.gz
コンピュータクラスタ内のノードよりもローカルに拡張する方がはるかに簡単です。