如何在 bash 中并行执行脚本?
How to execute a script in parallel in bash?
我有一个文件夹,其中包含扩展名为 .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
但效果不佳
for i in *.bam; do
samtools depth -ab target_interval.bed $i.bam > $i.txt &
sleep .5
done
# 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 "".bam > "".txt' --
既然你提到了'parallel'这个词,你也可以用GNU Parallel批处理这些。像这样的东西应该可以工作:
parallel "samtools depth -ab target_interval.bed {} > {= s/\.bam/.txt/ =}" ::: *bam
请注意您有足够的内存来一次处理多个 BAM。
人们对这个问题投了反对票。
我对脚本做了简单的修改。我刚刚删除了 $i.bam
并只保留了 $i
。如果我使用 $i.bam
,它会读取类似 x.bam.bam
的文件,该文件在目录
中不可用
更新后的代码是:
for i in *.bam; do
samtools depth -ab target_interval.bed $i > $i.txt;
done
干杯!!!
使用制作
BAMS=$(shell find . -type f -name "*.bam")
%.txt:%.bam
samtools depth -ab target_interval.bed $< > $@
all: $(BAMS:.bam=.txt)
调用:make -j 4
我有一个文件夹,其中包含扩展名为 .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
但效果不佳
for i in *.bam; do
samtools depth -ab target_interval.bed $i.bam > $i.txt &
sleep .5
done
# 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 "".bam > "".txt' --
既然你提到了'parallel'这个词,你也可以用GNU Parallel批处理这些。像这样的东西应该可以工作:
parallel "samtools depth -ab target_interval.bed {} > {= s/\.bam/.txt/ =}" ::: *bam
请注意您有足够的内存来一次处理多个 BAM。
人们对这个问题投了反对票。
我对脚本做了简单的修改。我刚刚删除了 $i.bam
并只保留了 $i
。如果我使用 $i.bam
,它会读取类似 x.bam.bam
的文件,该文件在目录
更新后的代码是:
for i in *.bam; do
samtools depth -ab target_interval.bed $i > $i.txt;
done
干杯!!!
使用制作
BAMS=$(shell find . -type f -name "*.bam")
%.txt:%.bam
samtools depth -ab target_interval.bed $< > $@
all: $(BAMS:.bam=.txt)
调用:make -j 4