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)
您正在文件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)
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
5631 次 |
| 最近记录: |