向 FOR 任务添加并行功能

Adding parallel capabilities to a FOR task

我要执行以下命令:

for i in {0-months,3-months,6-months,9-months,12-months,EC1,EC2_CZ,EC2,EC3}; do freebayes --fasta-reference ../Genome/ECIII_Lemming_assembly_masked.fasta --pooled-continuous --min-coverage 10 -F 0.01 -C 2 --vcf vcf/${i}.vcf ${i}.sort.grp.bam; done

但是这些任务是相互独立的,可以运行并行。我想知道是否有办法用 gnu parallel 来做到这一点。

通常在使用并行时,我会有一个文件列出 运行 所需的所有命令,在这种情况下它看起来像这样:

freebayes --fasta-reference ../Genome/ECIII_Lemming_assembly_masked.fasta --pooled-continuous --min-coverage 10 -F 0.01 -C 2 --vcf vcf/0-months.vcf 0-months.sort.grp.bam
freebayes --fasta-reference ../Genome/ECIII_Lemming_assembly_masked.fasta --pooled-continuous --min-coverage 10 -F 0.01 -C 2 --vcf vcf/3-months.vcf 3-months.sort.grp.bam
freebayes --fasta-reference ../Genome/ECIII_Lemming_assembly_masked.fasta --pooled-continuous --min-coverage 10 -F 0.01 -C 2 --vcf vcf/6-months.vcf 6-months.sort.grp.bam
freebayes --fasta-reference ../Genome/ECIII_Lemming_assembly_masked.fasta --pooled-continuous --min-coverage 10 -F 0.01 -C 2 --vcf vcf/9-months.vcf 9-months.sort.grp.bam
freebayes --fasta-reference ../Genome/ECIII_Lemming_assembly_masked.fasta --pooled-continuous --min-coverage 10 -F 0.01 -C 2 --vcf vcf/12-months.vcf 12-months.sort.grp.bam
freebayes --fasta-reference ../Genome/ECIII_Lemming_assembly_masked.fasta --pooled-continuous --min-coverage 10 -F 0.01 -C 2 --vcf vcf/EC1.vcf EC1.sort.grp.bam
freebayes --fasta-reference ../Genome/ECIII_Lemming_assembly_masked.fasta --pooled-continuous --min-coverage 10 -F 0.01 -C 2 --vcf vcf/EC2_CZ.vcf EC2_CZ.sort.grp.bam
freebayes --fasta-reference ../Genome/ECIII_Lemming_assembly_masked.fasta --pooled-continuous --min-coverage 10 -F 0.01 -C 2 --vcf vcf/EC2.vcf EC2.sort.grp.bam
freebayes --fasta-reference ../Genome/ECIII_Lemming_assembly_masked.fasta --pooled-continuous --min-coverage 10 -F 0.01 -C 2 --vcf vcf/EC3.vcf EC3.sort.grp.bam

所以当文件准备好后,我可以简单地 运行:

parallel -j 4 -a FILE freebayes

但这需要将命令写入文件,然后调用并行,必须有更简单的方法。

这似乎有效:

parallel -j 4 -a \
<(for i in {0-months,3-months,6-months,9-months,12-months,EC1,EC2_CZ,EC2,EC3}; do echo "freebayes --fasta-reference ../Genome/ECIII_Lemming_assembly_masked.fasta --pooled-continuous --min-coverage 10 -F 0.01 -C 2 --vcf vcf/${i}.vcf ${i}.sort.grp.bam"; done)
freebayes

但这看起来很傻...有更简单的方法吗? 谢谢!

我真的很困惑你是如何想出你极其复杂(但有效)的方法来做到这一点的:

parallel -j 4 freebayes --fasta-reference \
../Genome/ECIII_Lemming_assembly_masked.fasta --pooled-continuous \
--min-coverage 10 -F 0.01 -C 2 --vcf vcf/{}.vcf {}.sort.grp.bam \
::: 0-months 3-months 6-months 9-months 12-months EC1 EC2_CZ EC2 EC3

如果vcf-dir中的所有vcf文件都是这些,而且是4核机器,你还可以:

parallel freebayes --fasta-reference \
../Genome/ECIII_Lemming_assembly_masked.fasta --pooled-continuous \
--min-coverage 10 -F 0.01 -C 2 --vcf {} {/.}.sort.grp.bam \
::: vcf/*.vcf

你看完教程了吗? man parallel_tutorial

你看过介绍视频了吗:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

你看过例子了吗:LESS=+/EXAMPLE: man parallel