2014-09-23 79 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)