12

这是我的脚本:

#!/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

这里在“source”目录中有大约 30 个子目录。每个子目录都有我想合并到一个 R1.fastq.gz 和 R2.fastq.gz 文件中的R1 .fastq.gz 文件和R2 .fastq.gz 文件,然后将合并后的文件保存到目标目录。我的代码运行良好,但由于数据量大,我需要加快速度。我只想知道有什么方法可以在我的脚本中实现多线程编程吗?如何运行我的脚本以使多个作业并行运行?新的 bash 脚本,所以任何帮助将不胜感激。

4

2 回答 2

9

最简单的方法是在后台执行命令,在&命令末尾添加:

#!/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 手册

如果命令被控制操作符“&”终止,则shell 在子shell 中异步执行命令。这称为在后台执行命令。shell 不等待命令完成,返回状态为 0(真)。当作业控制未激活时(请参阅作业控制),异步命令的标准输入在没有任何显式重定向的情况下从 /dev/null 重定向。

于 2013-08-22T15:29:02.677 回答
3

我不确定,但您可以尝试&在这样的命令末尾使用

zcat $f/*R1*.fastq.gz | gzip > $destdir/"$fbase"_R1.fastq.gz &
zcat $f/*R2*.fastq.gz | gzip > $destdir/"$fbase"_R2.fastq.gz &
于 2013-08-22T15:26:51.217 回答