2014-09-23 56 views
2

我有一个命令我要对所有文件夹的文件中运行的一部分,该命令的语法如下:击:替换文件名

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 

回答

3

您可以使用:

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

测试:

f='path/to/sample1.fastq' 
echo "${f/.fastq/.bam}" 
path/to/sample1.bam 
+0

非常感谢,它做到了!总是有一些小...你有任何想法如何解决我编辑中的问题? – Sajber 2014-09-24 06:05:43

+0

您可以使用'“$ {f/_ [0-9] .fastq/.bam}”'编辑零件。 – anubhava 2014-09-24 06:08:20

+0

如果你想'path/to/sample.bam'作为最终输出,你也可以使用''$ {f/[0-9] _ [0-9] .fastq/.bam}“''' – anubhava 2014-09-24 06:20:53

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" 
2

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

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

%.bam: %.fastq 
    tophat -o [email protected] $< 

all: $(FASTQS:.bam=.fastq)