3

我有一个要在文件夹的所有文件上运行的命令,该命令的语法如下所示:

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
4

3 回答 3

4

您可以使用:

tophat -o "${f/.fastq/.bam}" "$f"

测试:

f='path/to/sample1.fastq'
echo "${f/.fastq/.bam}"
path/to/sample1.bam
于 2014-09-23T14:17:53.973 回答
3

不是答案而是建议:作为生物信息学家,您应该使用GNU make及其选项-j (number of parallel jobs)。Makefile 将是:

.PHONY:all
FASTQS=$(shell ls *.fastq)

%.bam: %.fastq
    tophat -o $@ $<

all:  $(FASTQS:.bam=.fastq)
于 2014-09-23T19:38:04.760 回答
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"
于 2014-09-23T18:20:56.627 回答