2013-08-22 93 views
9

这是我的脚本:如何在我的bash脚本中使用并行编程/多线程?

#!/bin/bash 
#script to loop through directories to merge fastq files 
sourcedir=/path/to/source 
destdir=/path/to/dest 

for f in $sourcedir/* 
do 
    fbase=$(basename "$f") 
    echo "Inside $fbase" 
    zcat $f/*R1*.fastq.gz | gzip > $destdir/"$fbase"_R1.fastq.gz 
    zcat $f/*R2*.fastq.gz | gzip > $destdir/"$fbase"_R2.fastq.gz 
done 

在这里有在目录“来源”约30子目录。每个子目录都有一定的R1.fastq.gz文件和R2.fastq.gz,我想合并成一个R1.fastq.gz和R2.fastq.gz文件,然后将合并的文件保存到目的地目录。我的代码工作正常,但我需要加快它的数据量。我只想知道我有什么方法可以在脚本中实现多线程编程?我如何运行我的脚本,以便多个作业并行运行?新的bash脚本,所以任何帮助将不胜感激。

+0

既然你清楚地处理生物信息学,你应该阅读这些:http://www.biostars.org/p/81359/ http://www.biostars.org/p/63816/ –

回答

7

最简单的方法是在后台加入&到命令的最后执行的命令,结束使用&

#!/bin/bash 
#script to loop through directories to merge fastq files 
sourcedir=/path/to/source 
destdir=/path/to/dest 

for f in $sourcedir/* 
do 
    fbase=$(basename "$f") 
    echo "Inside $fbase" 
    zcat $f/*R1*.fastq.gz | gzip > $destdir/"$fbase"_R1.fastq.gz & 
    zcat $f/*R2*.fastq.gz | gzip > $destdir/"$fbase"_R2.fastq.gz & 
done 

bash manual

如果命令是由控制操作员'&'终止,shell在子shell中异步执行命令。这被称为在后台执行命令。 shell不会等待命令完成,并且返回状态为0(true)。如果作业控制未处于活动状态(请参阅作业控制),则在没有任何明确重定向的情况下,异步命令的标准输入会从/ dev/null重定向。

+0

我实际上指的到其他关于这个问题的stackoverflow问题,他们提到像pid和等待和事情的东西。那么,在命令末尾添加一个&并行工作的有效方式? –

+1

@ user2703967是的......加入'&'会产生一个新的子shell,它会在你的脚本继续时消失并执行它。如果你需要比这更复杂的东西,你可能不应该首先使用bash。 –

+0

谢谢,最后一个问题。当我在“完成”之后使用“等待”时,它有什么不同? –

3

我不知道,但你可以尝试在命令中像这样

zcat $f/*R1*.fastq.gz | gzip > $destdir/"$fbase"_R1.fastq.gz & 
zcat $f/*R2*.fastq.gz | gzip > $destdir/"$fbase"_R2.fastq.gz & 
相关问题