Как выполнить скрипт параллельно в bash? - PullRequest
0 голосов
/ 04 марта 2020

У меня есть папка с файлами с расширением .bam . Я хочу запустить следующий скрипт одновременно и создать отдельный вывод для каждого входного имени и расширения .txt

samtools depth -ab target_interval.bed 12345XX.bam > 12345XX.txt

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

for i in *.bam; do
samtools depth -ab target_interval.bed $i.bam > $i.txt
done

, но он не работает эффективно

Ответы [ 5 ]

3 голосов
/ 04 марта 2020

Поскольку вы упомянули слово «параллельный», вы также можете выполнить пакетную обработку с помощью GNU Parallel . Примерно так должно работать:

parallel "samtools depth -ab target_interval.bed {} > {= s/\.bam/.txt/ =}" ::: *bam

Только будьте осторожны, у вас достаточно памяти для одновременной обработки нескольких BAM.

2 голосов
/ 04 марта 2020
for i in *.bam; do
samtools depth -ab target_interval.bed $i.bam > $i.txt &
sleep .5
done
1 голос
/ 05 марта 2020

с использованием Make

BAMS=$(shell find . -type f -name "*.bam")
%.txt:%.bam
    samtools depth   -ab target_interval.bed $< > $@

all: $(BAMS:.bam=.txt)

invoke: make -j 4

1 голос
/ 04 марта 2020
# list all files matched with '*.bam' on separate lines
find . -maxdepth 1 -type f -name '*.bam' |
# remove bam suffix from all the files
sed 's/\.bam$//' | 
# use `xargs` to parallelize execution on nproc codes
xargs -d$'\n' -n1 -P$(nproc) sh -c '
     samtools depth -ab target_interval.bed "$1".bam > "$1".txt' --
0 голосов
/ 05 марта 2020

Люди не голосуют по этому вопросу. Я сделал простые изменения в сценарии. Я только что удалил $i.bam и сохранил только $i. Если я использую $i.bam, он читает файл типа x.bam.bam, который недоступен в каталоге

Обновленный код:

for i in *.bam; do
samtools depth -ab target_interval.bed $i > $i.txt;
done

Приветствия !!!

...