我正在使用此脚本连接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 &
答案 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之间进行并行化。
另一个选择就是这样,只在R
和f
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
希望这有帮助!