在 Unix 中合并 fastq.gz 文件

Rge*_*eek 2 parallel-processing bash shell

我正在使用此脚本来连接从 Samples 中读取的内容。每个子目录都有某些 R1.fastq.gz 文件和 R2.fastq.gz,我想将它们合并到一个 R1.fastq.gz 和 R2.fastq.gz 文件中。

sourcedir=/sourcepath/
destdir=/destinationpath/

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
Run Code Online (Sandbox Code Playgroud)

我想通过比较各个 fastq.gz 文件的总行数和合并文件中的总行数来验证 R1、R2 的读取是否分别串联。

 wc -l *R1*.fastq.gz (Individual files)
 12832112 total

 wc -l Sample_51770BL1_R1.fastq.gz  (merged file)
 Total:10397604 
Run Code Online (Sandbox Code Playgroud)

两种情况下的数量不应该相等吗?或者是否有其他方法来验证合并的文件是否正确完成?

另外,有什么方法可以加快进程吗?我尝试使用此链接中的 & 如何在我的 bash 脚本中使用并行编程/多线程? 但它根本没有运行。

zcat $f/*R1*.fastq.gz | gzip >$destdir/"$fbase"_R1.fastq.gz &
zcat $f/*R2*.fastq.gz | gzip >$destdir/"$fbase"_R2.fastq.gz &
Run Code Online (Sandbox Code Playgroud)

mir*_*los 5

您正在文件wc -l上运行.gz,这不是您想要的。要验证,您可以使用类似这样的内容:

zcat *R1*.fastq.gz | wc -l
zcat Sample_51770BL1_R1.fastq.gz | wc -l
Run Code Online (Sandbox Code Playgroud)

尽管您可能想使用适当的校验和算法,例如使用sha256sum工具。


至于并行化,您可以并行化解压缩,但不能并行化压缩,因为您正在将内容一个接一个地写入一个流(文件)中。例如这样:

sourcedir=/sourcepath/
destdir=/destinationpath/

for f in $sourcedir/*; do
        fbase=${f##*/}
        echo "Inside $fbase"
        for R in 1 2; do
                for xf in $f/*R$R*.fastq.gz; do
                        gzip -dc <$xf >${xf%.gz} &
                done
                wait
                cat $f/*R$R*.fastq | gzip -n9 >$destdir/"$fbase"_R$R.fastq.gz
                rm -f $f/*R$R*.fastq
        done
done
Run Code Online (Sandbox Code Playgroud)

这种方法的问题在于,您需要将中间解压结果写入磁盘(或其他临时存储),这通常比不并行解压慢得多。另外,您不能以这种方式在 R1 和 R2 之间进行并行化。

另一种选择是这样,仅在Rs 和fs 之间进行并行(从胃的感觉来看,这应该可以在不向后弯太多的情况下获得最佳结果):

sourcedir=/sourcepath/
destdir=/destinationpath/

for f in $sourcedir/*; do
        fbase=${f##*/}   
        echo "Inside $fbase"
        for R in 1 2; do
                zcat $f/*R$R*.fastq.gz | gzip -n9 >$destdir/"$fbase"_R$R.fastq.gz &
        done
done
wait
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!