为什么没有在prinseqlite perl循环中写入输出文件?

时间:2018-08-23 06:34:56

标签: perl file loops output sh

我对这种类型的编码/命令行完全陌生,所以如果我以错误的方式问这个问题,我感到抱歉。

我想遍历目录中的所有文件(我的质量是修整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

是否有简单的原因/答案?

1 个答案:

答案 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.fastq60782_merged_rRNA.fastq的输入文件。如果要去除重复的.fastq部分,则需要类似以下内容的

... -out_good /proj/forhot/qfiltered/looptest/"${i%.fastq}"_filtered.fastq