我有一个命令,我想在文件夹的所有文件上运行,命令的语法如下所示:
tophat -o <output_file> <input_file>
我想要做的是一个循环遍历任意文件夹中所有文件的脚本,并使用输入文件名来创建类似但不同的输出文件名。文件名如下所示:
input name desired output name
path/to/sample1.fastq path/to/sample1.bam
path/to/sample2.fastq path/to/sample2.bam
让输入工作似乎很简单:
for f in *.fastq
do
tophat -o <output_file> $f
done
我尝试使用output=${f,.fastq,.bam}
并将其用作输出参数,但这不起作用。我得到的只是一个错误:line 3: ${f,.fastq,.bam}: bad substitution
。这是做我想做的事情的方式,还是我应该做别的事?如果这是正确的方法,我做错了什么?
[编辑]:
感谢所有答案!一个额外的问题,但是......如果我有这样的文件,请改为:
path/to/sample1_1.fastq
path/to/sample1_2.fastq
path/to/sample2_1.fastq
path/to/sample2_2.fastq
...
...我可以拥有任意数量的样本(sampleX
),但所有样本都有两个与之关联的文件(_1
和_2
)。该命令现在看起来像这样:
tophat -o <output_file> <input_1> <input_2>
所以,仍然只有一个输出,我可以做一些像"${f/_[1-2].fastq/.bam}"
这样的事情,但我不确定如何得到一个循环只能在每个sampleX
上同时迭代一次同时取两个相关文件......想法?
[编辑#2]:
所以,这是完成这个伎俩的最终剧本!
for f in *_1.fastq
do
tophat -o "${f/_1.fastq/.bam}" $f "${f/_1.fastq/_2.fasq}"
done
答案 0 :(得分:3)
您可以使用:
tophat -o "${f/.fastq/.bam}" "$f"
<强>测试强>
f='path/to/sample1.fastq'
echo "${f/.fastq/.bam}"
path/to/sample1.bam
答案 1 :(得分:2)
不是答案而是建议:作为生物信息学家,您应该使用 GNU make 及其选项-j (number of parallel jobs)
。 Makefile将是:
.PHONY:all
FASTQS=$(shell ls *.fastq)
%.bam: %.fastq
tophat -o $@ $<
all: $(FASTQS:.bam=.fastq)
答案 2 :(得分:1)
替代anubhava的简洁解决方案,
d=$(dirname path/to/sample1.fastq)
b=$(basename path/to/sample1.fastq .fastq)
echo $d/$b.fastq
path/to/sample1.fastq
tophat -o "$d/$b.fastq" "$f"