我使用这个脚本连接从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我希望通过比较来自单个R1文件的总行和合并文件中的总行来验证来自fastq.gz和R2的读取分别是连接的。
wc -l *R1*.fastq.gz (Individual files)
12832112 total
wc -l Sample_51770BL1_R1.fastq.gz (merged file)
Total:10397604 在这两种情况下,不应该数字相等吗?还是有任何其他方法来验证合并的文件是否正确完成?
另外,有没有任何方法来加快这个过程?我试着使用&从这个链接如何在bash脚本中使用并行编程/多线程?,但它根本不运行。
zcat $f/*R1*.fastq.gz | gzip >$destdir/"$fbase"_R1.fastq.gz &
zcat $f/*R2*.fastq.gz | gzip >$destdir/"$fbase"_R2.fastq.gz &发布于 2013-12-23 22:38:06
您正在.gz文件上运行.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之间进行并行处理。
另一种选择是,只在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希望这能有所帮助!
https://stackoverflow.com/questions/20751925
复制相似问题