在数据分析伊始,判断文件的完整性是一个基本步骤,尤其是在处理测序数据原始文件时。那么有哪些方法呢?
校验和(Checksum)
校验和是一种通过对文件内容进行特定的数学运算,生成一个唯一的数字值(例如,MD5、SHA-1、SHA-256等)。该值可以用于验证文件的完整性。
- SHA-256:
sha256sum filename
在网络传输、设备之间转存、复制大文件等时,可能会出现传输前后数据不一致的情况。为避免这种情况可以重新计算其校验和,并与原始校验和进行比较。如果两者相同,则文件未被篡改。因此,在数据分析过程中一个良好的习惯是,每次传输完数据都进行一下文件校验。
通常比较常用的是使用MD5值校验。MD5(Message-Digest Algorithm 5,消息摘要算法 5)是一种哈希函数,用于生成128 位(16 字节) 的哈希值(摘要)。通常以32 个十六进制字符的形式表示。它是一种不可逆加密算法,用于验证数据完整性,而不是用于加密和解密。
MD5 的特性
- 定长输出:无论输入数据多大,MD5 都会输出 128 位(32 个十六进制字符)的哈希值。
- 高效计算:计算 MD5 哈希值的速度较快,适合大数据量校验。
- 弱抗碰撞性:不同的输入理论上应该产生不同的 MD5 值,但由于哈希碰撞问题,在高安全性场景(如密码存储、数字签名)已不推荐使用。但在生信数据分析中,使用MD5校验足矣。
计算MD5值
md5sum 是 Linux 和 macOS 中的一个命令行工具,用于计算和验证文件的 MD5 哈希值(MD5 校验和)
##字符串md5值
echo -n "TCATGATTGAATGGAATTGAATGGAATCATCGAATG" |md5sum
###-n 选项避免 echo 产生换行符,否则 MD5 计算结果会不同。
##单个文件
md5sum align_star_r1_se.sh
##批量
md5sum ./align_star_r*
md5sum ./* >bam_md5.txt
MD5文件通常包含两列,一列为待校验文件的md5值,另一列为待校验文件
文件校验
通常是使用-c
参数即可。但也可以根据需求,选择合适的选项来更精确地控制验证过程。
--status
:只返回退出状态码,不输出任何文件信息。-w
和 --warn
:在文件格式不正确时发出警告。
基本用法
##文件校验
md5sum -c bam_md5.txt
注:
1、MD5.txt 包含两列,一列为待校验文件的md5值,另一列为待校验文件名,如果第二列包含文件路径,那么 md5sum -c
就需要在合适的目录下执,以确保程序能正确识别到校验文件。比如下面这个情况,就需要在data文件所在的目录下执行 md5sum -c
,而不能是在fastq文件所在的目录下执行(除非自己重新编辑MD5文件的第二列信息)。
2、md5sum 是校验文件内容,与文件名是否相同无关
3、md5sum 值逐位校验,所以文件越大,校验时间越长。
跳过缺失文件
一个包含多个文件的校验和文件 md5.txt
,如果你只下载了其中一部分文件,可以使用 --ignore-missing
来忽略那些缺失的文件。md5sum
会跳过它们,不会报告错误,只有存在的文件会被验证。
md5sum -c --ignore-missing md5.txt
只显示校验不通过的文件
如果你只想知道哪些文件验证失败,而不关心成功的文件,可以使用 --quiet
。
md5sum -c --quiet md5_124.txt
成功的文件不会输出任何信息,只有校验和不匹配的文件才会显示在输出中。
显示格式不正确的文件
如果md5文件中有无效的哈希值,要在任何哈希值不正确时发出警告,可以使用 --warn
选项。
md5sum -c -w md5.txt
md5sum -c --warn md5.txt
在脚本中使用
在自动化脚本中,如果需要进行文件一致性检验时,可以采用如下方法:
#!/bin/bash
#
md5sum -c --status md5.txt
Result=$?
echo "File check status is: $Result"
exit $Result
--status
只关心 md5sum
是否成功,,而不需要显示每个文件的验证状态。
- 如果所有文件都正确,命令会静默成功返回(退出状态码 0)。
- 如果文件校验失败,命令会返回失败(退出状态码 1)。
巧用解压缩
如果没有MD5值文件,对于压缩文件(如.tar.gz
、.zip
等),通常可以通过解压缩的 -t
参数来检查文件的完整性。详见:玩转服务器8—Linux文件压缩与解压一览表
gzip -t file.fastq.gz
bzip2 -t file.txt.bz2
tar -txf file.tar.gz
unzip -t file.zip
unrar t file.rar
7z t file.7z
.....
如果检验完之后,很不幸,你的原始数据有损坏,但是你又没有备份,或许可以采用这个方法拯救一下: SeqKit — 超快速的 FASTA和FASTQ 文件操作工具包
如果你也需要共享服务器,详见:满足你生信分析计算需求的低价解决方案福利抢购方式: