我对这种类型的编码/命令行完全陌生,所以如果我以错误的方式问这个问题,我感到抱歉。
我想遍历目录中的所有文件(我的质量是修整DNA测序文件(.fastq格式))
我写了这个循环:
for i in *.fastq; do
perl /apps/prinseqlite/0.20.4/prinseq-lite.pl -fastq $i -min_len 220 -max_len 240 -min_qual_mean 30 -ns_max_n 5 -trim_tail_right 15 -trim_tail_left 15 -out_good /proj/forhot/qfiltered/looptest/$i_filtered.fastq -out_bad null; done
代码本身似乎可以正常工作,我可以在终端中看到它正在获取正确的文件并且正在进行修整(它正在向终端中写入摘要日志),但是没有生成输出文件-即这些:
-out_good /proj/forhot/qfiltered/looptest/$i_filtered.fastq
如果我以非循环方式运行代码,则只需在一个文件上运行即可(=生成输出)。链接此示例:
prinseq-lite.pl -fastq 60782_merged_rRNA.fastq -min_len 220 -max_len 240 -min_qual_mean 30 -ns_max_n 5 -trim_tail_right 15 -trim_tail_left 15 -out_good 60782_merged_rRNA_filt_codeTEST.fastq -out_bad null
是否有简单的原因/答案?
答案 0 :(得分:3)
此问题与Perl完全无关。
外壳将 /proj/forhot/qfiltered/looptest/$i_filtered.fastq
读为对i_filtered
内容的内插。没有此类shell变量,因此此参数变为/proj/forhot/qfiltered/looptest/.fastq
($i_filtered
变为空)。
因此,您所有的prinseq-lite.pl
执行都将其输出保存在同一文件中(因为其名称以.
开头)是“隐藏的”:您需要使用ls -a
来执行看到它,而不仅仅是ls
。
修复
... -out_good /proj/forhot/qfiltered/looptest/${i}_filtered.fastq
请注意,这会给您例如60782_merged_rRNA.fastq_filtered.fastq
为60782_merged_rRNA.fastq
的输入文件。如果要去除重复的.fastq
部分,则需要类似以下内容的
... -out_good /proj/forhot/qfiltered/looptest/"${i%.fastq}"_filtered.fastq