2014-09-23 2 views
2

У меня есть команда, которую я хочу работать на все файлы в папке, и синтаксис команды выглядит следующим образом:Bash: заменить часть файла

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. Это способ делать то, что я хочу, или мне делать что-то еще? Если это правильный путь, что я делаю неправильно?

[EDIT]:

Спасибо за все ответы! Бонусный вопрос, хотя ... Что делать, если у меня есть файлы с именем, как это, вместо того, чтобы:

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 в то же время, что и связанные файлы ... Идеи?

[EDIT 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

+0

Вы можете использовать '' $ {f/_ [0-9] .fastq/.bam} "для отредактированной части. – anubhava

+0

Вы также можете использовать '' $ {f/[0-9] _ [0-9] .fastq/.bam} ", если вы хотите, чтобы в качестве конечного вывода был' path/to/sample.bam'. – anubhava

1

Альтернатива анубхава'S краткое решение,

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) 
Смежные вопросы