在Unix中合并fastq.gz文件

时间:2013-12-23 22:11:37

标签: bash shell parallel-processing

我正在使用此脚本连接Samples.Each子目录中的某些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

我想通过比较各个fastq.gz文件的总行数和合并文件中的总行数来验证来自R1,R2的读取是否连接在一起。

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

 wc -l Sample_51770BL1_R1.fastq.gz  (merged file)
 Total:10397604 

在这两种情况下,数字是否应该相等,或者是否有其他方法可以验证合并的文件是否正确完成?

另外,有没有办法加快这个过程?我尝试使用&从这个链接 How do I use parallel programming/multi threading in my bash script? 但它根本没有运行。

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

1 个答案:

答案 0 :(得分:2)

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

zcat *R1*.fastq.gz | wc -l
zcat Sample_51770BL1_R1.fastq.gz | wc -l

虽然您可能想要使用适当的校验和算法,例如使用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

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

另一个选择就是这样,只在Rf s之间进行并行化(从胃部感觉来看,这应该可以获得最好的结果,而不会过度向后弯曲):

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

希望这有帮助!