2015-03-12 2 views
0

Я новичок в bash, так что это очень простой вопрос: Я пытаюсь использовать написанный ниже цикл $ for для выполнения ряда команд для нескольких файлов в каталоге , который должен заканчиваться новым выходом (f: r.bw) для каждого отдельного файла.
В принципе, у меня есть файлы, такие как chr1.gz, chr2.gz и так далее, которые должны в конечном итоге, как chr1.bw, chr2.bw ... То, как сейчас, кажется, постоянно перезаписывать тот же выходной файл, и я не могу понять, что такое правильный синтаксис является.Как я могу сгенерировать несколько выходных файлов в цикле

$ for file in *.gz 
do 
zcat < $file | grep -v ^track > f:r.temp 
wigToBigWig -clip -fixedSummaries -keepAllChromosomes f:r.temp hg19.chrom.sizes f:r.bw 
rm f:r.temp 
done 

Спасибо за помощь

ответ

2

Вместо использования фиксированного файла f:r.temp, основывает свое имя назначения на $file:

for file in *.gz; do 
    zcat <"$file" | grep -v '^track' >"${file%.gz}.temp" 
    wigToBigWig -clip -fixedSummaries -keepAllChromosomes \ 
    "${file%.gz}.temp" hg19.chrom.sizes "${file%.gz}.bw" 
    rm -f "${file%.gz}.temp" 
done 

${file%.gz} является parameter expansion операцией, которая обрежет .gz от конца имя; ${file%.gz}.bw, таким образом, обрезает .gz и добавляет .bw.


Еще лучше, если wigToBigWig не нужен реальный() входной доступный для поиска файла, вы можете дать ему трубопровод в zcat | grep процесс непосредственно и не нужен никакой временного файл:

for file in *.gz; do 
    wigToBigWig -clip -fixedSummaries -keepAllChromosomes \ 
    <(zcat <"$file" | grep -v '^track') \ 
    hg19.chrom.sizes \ 
    "${file%.gz}.bw" 
done 
+0

Спасибо! Я попробовал верхнее предложение, и он работает! – kwiesel

Смежные вопросы