2014-12-10 4 views
1

У меня есть каталог и внутри у меня есть два типа файлов: * .sai и * fastq и я Вант использовать как переменную в одной оболочке для цикла:Два переменной в одном цикл в Баш

for j in *sai *fastq 

do bwa samse $j $j > ${j%.sai}.sam 

done; 

после command do Я хочу загрузить соответствующие данные .sai и * .fastq в программу (bwa samse). Не могли бы вы помочь мне с синтаксисом?

Пример:

в один каталог xx.fast xx.sai yy.fastq yy.sai и программа BWA samse нужно обрабатывать в одно время два соответствующих файлов - bwa samse xx.fastq xx.sai...

Большое спасибо за любые идеи.

+0

ли два файла (в то время), имеет один и то же стартовое имя до сая & fastq? –

+0

Да, они имеют то же имя перед расширением. – Paul

ответ

1

Try делая это с Башем parameter expansion:

for j in .*sai; do 
    [[ -s ${j%.sai}.fastq ]] && 
     bwa samse "$j" "${j%.sai}.fastq" > "${j%.sai}.sam"  
done 

и, пожалуйста, прекратите убивать кошечку с разбором ls вывода. (Не для вас Incorigible)

+0

Спасибо, что указали это. – eigenchris

+1

Я должен знать, кто является Неподходящим ':)' Nevermind ... –

+0

Что делает одиночный '$ j %'? Это опечатка? Кроме того, я бы рекомендовал проверить, что существует соответствующий файл '.fastq', только для здравого смысла. –

0

(Editted с учетом замечаний - с помощью ls в список имен файлов не требуется)

обирать расширение файла вам необходимо использовать ${j%\.*}, который сохранит все символы до последнего .

for j in *.sai *.fastq 
do 
    bwa samse $j $j > ${j%\.*}.sam 
done; 
+1

Не используйте 'ls', как это. 'for j in * .sai * .fastq' верен. – chepner

+0

Остановить использование 'ls'! –

+1

@eigenchris Спасибо за комментарий. Indirectory У меня есть, например, xx.fast xx.sai yy.fastq yy.sai и программа bwa samse нужно обрабатывать за один раз два соответствующих файла - bwa samse xx.fastq xx.sai ... Прямо сейчас это дало мне bwa samse xx .fastq xx.fastq (два раза тот же файл). Надеюсь, это ясно :-) – Paul

1

Не пытайтесь использовать ls для подачи петли. Используйте расширение распорка включать только *.sai и *.fastq файлов в цикле:

for j in ./*.{sai,fastq} 
do 
    ## do what you need to the *.sai & *.fastq files 
done 

Вы также можете предоставить переменную пути:

mypath=/path/to/files 
for j in "${mypath}"/*.{sai,fastq} 
(snip) 

ПРИМЕЧАНИЕ: Понятия не имею, что bwa samse $j $j > ${j%\.*}.sam делает. Объясните, как вы должны обрабатывать файлы, и я могу помочь дальше ..

Если есть 1-к-1 соотношение (соответствие .sai и .fastq файлы), а затем просто:

for j in ./*.sai 
do 
    fname="${j%.*}" # remove the extension ($fname is filename w/o ext) 
    ## do what you need to the *.sai & *.fastq files 
    # bwa samse "${fname}.sai" "${fname}.fastq" whatever else 
done 
1

Использование GNU Parallel это выглядит следующим образом:

parallel bwa samse ref.fasta {} {.}.fastq '>' {.}.sam ::: *.sai 

GNU Parallel является общим распараллеливатель и делает легко выполнять задания параллельно на одной и той же машине или на нескольких машинах у вас есть ssh доступ к. Он часто может заменить петлю for.

Если у вас есть 32 различных заданий, которые вы хотите работать на 4-х процессоров, прямо вперед способ распараллеливания является выполнение 8 заданий на каждом CPU:

Simple scheduling

GNU Parallel вместо порождает новый процесс, когда один заканчивается - поддержание процессоров активным и тем самым экономя время:

GNU Parallel scheduling

Установка

Если GNU Parallel не упакован для вашего дистрибутива, вы можете выполнить личную установку, которая не требует доступа root. Это может быть сделано в течение 10 секунд, делая это:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash 

Для других вариантов установки см http://git.savannah.gnu.org/cgit/parallel.git/tree/README

Подробнее

Другие примеры: http://www.gnu.org/software/parallel/man.html

смотреть интро видео: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Прогулка по t он учебник: http://www.gnu.org/software/parallel/parallel_tutorial.html

Зарегистрируйтесь на список адресов электронной почты, чтобы получить поддержку: https://lists.gnu.org/mailman/listinfo/parallel