FASTQ | md5 | 原始文件保存、传输、完整性检验 | 修复
一般在传输过程中中断,fastq就会truncate,但仍然可以用zless或者zcat打开查看。
真到万不得已的时候还是要截取可以利用的部分,然后用bbmap修复一下。
bbmap
repair.sh -Xmx14g in1=1.fq.gz in2=2.fq.gz out1=1_1.fq.gz out2=1_2.fq.gz outs=outs.fq.gz repair
最简单快速的fastq check方法
export PATH=/home/zz950/softwares/self_bin:$PATH fastqc -t 20 -o fastqc *fq.gz
如果fastq文件不完整,truncated,fastqc就会报错。
Failed to process file M303P1_2.fq.gz uk.ac.babraham.FastQC.Sequence.SequenceFormatException: Ran out of data in the middle of a fastq entry. Your file is probably truncated at uk.ac.babraham.FastQC.Sequence.FastQFile.readNext(FastQFile.java:179) at uk.ac.babraham.FastQC.Sequence.FastQFile.next(FastQFile.java:125) at uk.ac.babraham.FastQC.Analysis.AnalysisRunner.run(AnalysisRunner.java:77) at java.lang.Thread.run(Thread.java:748)
Mac上安装md5sum
brew install md5sha1sum
像fastq这样的原始文件是肯定不能丢掉的,必须保存在硬盘里或者放到ftp服务器上,以便之后再度调取分析。
fastq保存时问题不大,但因为文件巨大,传输通常需要几小时-几天,非常容易在传输过程中损毁,这时候我们就需要一种方法来检验我们下载的fastq(任何其他原始文件)是否完整。
MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。
安装:Macos 安装md5sum、sha1sum、md5deep、sha1deep【目前测试mac生成比较慢,不适合大数据,md5 -r类似于md5sum的功能】
brew install md5sha1sum
建议:任何原始文件都必须构建md5原始验证码,然后存档。
md5sum *.gz > md5.txt
传输前的批量密码生成,最好是已经跑完流程,确保fastq没问题。
md5sum */*/*fastq.gz > all.md5.txt
传输后的批量检测:
md5sum -c md5.txt
如果下载的fastq没有md5,则有几种办法:
一、用gzip检验gz的文件完整性
参考:使用gunzip命令的t参数检测fastq的gz文件完整度
gunzip -t SRR11652583_2.fastq.gz
二、检查配对端FASTQ数据完整性
直接计数行数即可,配对就基本没问题。
wc -l `gzcat *.gz` # 不可用
wc -l `find -name *.gz`
OSX不能直接用zcat,Linux则可以。
对于这种大数据,最好使用C写的工具,哪些别人用perl和python写的就不要用了,速度可以气死你,Linux上的基础命令基本能胜任大部分工作。
并行加速
brew install pigz
for x in *.gz; do unpigz -p 8 -c $x | wc -l && echo $x; done
三、如果文件较少,可以直接看tail的read名字是否匹配。
我喜欢用for,配合文件输入输出操作,可以用,速度也不会慢。
echo "last line" > tail.name for i in `ls *.gz` do echo $i >> tail.name gzcat $i | tail -4 | grep '@' >> tail.name echo "" >> tail.name done
普通的gzcat太慢了,需要按顺序读到文件的最后一行。
这里发现了一个神器,gztool,可以给gz文件构建索引,然后直接读取最后几行,非常厉害。
echo "last line" > tail.name for i in `ls *.gz` do echo $i >> tail.name # gzcat $i | tail -4 | grep '@' >> tail.name /Users/zxli/Downloads/rawdata/gztool/gztool -t $i | tail -4 >> tail.name echo "" >> tail.name done
我觉得第三种方法可以作为金标准,只要最后一个名字配对,基本不可能错。
确定没问题
last line Pool111-2_23_S23_L003_I1_001.fastq.gz @A00198:856:H5GFVDSX3:3:2678:32651:37059 1:N:0:CGGAACCCAA+TCCTCGAATC CGGAACCCAA + FFFF:FFF,, Pool111-2_23_S23_L003_I2_001.fastq.gz @A00198:856:H5GFVDSX3:3:2678:32651:37059 2:N:0:CGGAACCCAA+TCCTCGAATC TCCTCGAATC + :FF,FF,,,F Pool111-2_23_S23_L003_R1_001.fastq.gz @A00198:856:H5GFVDSX3:3:2678:32651:37059 1:N:0:CGGAACCCAA+TCCTCGAATC CGCGATTCAAGTAAGCGGTGCAAAGGGG + FFFF:,FFFFFFF,FFFF,FFF:FFF,, Pool111-2_23_S23_L003_R2_001.fastq.gz @A00198:856:H5GFVDSX3:3:2678:32651:37059 2:N:0:CGGAACCCAA+TCCTCGAATC GGACTCCAACTACTTCGATCCCAGCAAGATCCAGTTACCAGAAGAGGACTGATGGCTTACCGAGCAGGGCCTAAGAAGCATTACTCAGCC + FFF,:FF:FF,,F:FFFFFFF:,FF::FF,FF,F,,FFF:F:,F:,F,FFFF:F::,F:FFFFFFFFFFFFF:FFF,FF,,,,F,F,,FF Pool111-2_23_S23_L004_I1_001.fastq.gz @A00198:856:H5GFVDSX3:4:2678:32777:37059 1:N:0:CGGAACCCAA+TCCTCGAATC CGGAACCCAA + FFFF:FFF,: Pool111-2_23_S23_L004_I2_001.fastq.gz @A00198:856:H5GFVDSX3:4:2678:32777:37059 2:N:0:CGGAACCCAA+TCCTCGAATC TCCTCGAATC + :FF,FF,:,F Pool111-2_23_S23_L004_R1_001.fastq.gz @A00198:856:H5GFVDSX3:4:2678:32777:37059 1:N:0:CGGAACCCAA+TCCTCGAATC TGCCTGTTCGGTACGCAACTTTAGCATA + :FFFFF:FFFFFFFFFFFF:,F:FFFFF Pool111-2_23_S23_L004_R2_001.fastq.gz @A00198:856:H5GFVDSX3:4:2678:32777:37059 2:N:0:CGGAACCCAA+TCCTCGAATC GTCGGGCGCCGGCGGCTTTGGTGACTCTAGATAACCTCGGGCCGATCGCACGCCCCCCGGGGCGGCGACGACCCATTCGAACGTCTGCCC + FFFFFFFFFFFFFFFF,FFFFFFFF,FF,FF:::FFFFFFFFFF:FFFFFFFF:F:FFF,FFFFFFFFFFFFFFF,:FFFF:FFFFFFFF
同一批数据,名字基本一样,就是lane和read R1/R2不一样。
R1和R2的长度不必一样!