《Bioinformatics-Data-Skills》之检验数据完整性
检查数据的完整性有以下好处:
- 大型数据在传输过程中由于网络波动等问题有可能会出现数据几个bit丢失的情况,检查数据的完整性可以保证数据的一致性;
- 通过数据的完整性检查我们也可以确定结果是否发生了变化,确定是否需要重新运行代码;
- 通过数据的完整性也有利于研究的可重现,可以使用文件校验和来作为数据版本(git commit ID)。
这里我们介绍一下数据完整性检验和SHA-1与MD5的使用以及对比文件区别的命令。
SHA与MD5
SHA-1与MD5码是非常类似的,前者出现更晚也更倾向于被采用(Github就是使用SHA-1码作为commit ID)。
相同的内容计算得到的SHA-1码是确定的,即使只有一个字节的不同,计算出来的SHA-1码也会不同。对于任意的内容都可以使用shasum
命令生成一个确定性的40位的SHA-1码:
echo "bioinformatics is interesting" | shasum
# 724b8c1fb2328b121bfcc7e68cdf31b94f3e7fa3 -
echo "bioinformatic is interesting"| shasum
# ea2e3f1ff9a8db12c283cd0e0186bafbb99198dc -
即使只有一个bit的差别,sha-1码都会不同。
可以通过如下的方式生成一个文件的SHA-1码:
shasum zmaysA_R1.fastq
# 506f25f62a7e5acfb4b5f866a570e78e4efd638a zmaysA_R1.fastq
对于大量文件,对每个文件分别对比SHA-1码非常麻烦。可以
- 将所有文件的SHA-1码存放于一个专门的文件:
shasum *fastq > fastq_checksum.sha
- 然后在检查文件的完整性的时候通过
-c
(check)参数直接调用SHA-1码文件:
shasum -c fastq_checksum.sha
# zmaysA_R2.fastq: OK
# zmaysB_R1.fastq: OK
# zmaysB_R2.fastq: OK
# zmaysC_R1.fastq: OK
# zmaysC_R2.fastq: FAILED
# shasum: WARNING: 1 computed checksum did NOT match
注意:你可能会好奇,SHA-1作为只有40位的16进制数字不可能包括所有文件内容的可能性,是有可能出现不同的文件对应同一SHA-1编码的冲突的。但是理论上来讲SHA-1码冲突的可能性只有1/16^40,远远低于文件出错的概率,所以可以采用这种方式来检验文件完整性。
diff
当我们发现两个文件的sha-1码不同的时候,并不清楚这种差别存在多大的影响。此时可以通过diff命令确定结果的差别,此命令的效果与git diff
类似。例如比较gene-1与gene-2文件的区别:
diff -u gene-1.bed gene-2.bed
# --- gene-1.bed 2021-05-27 15:23:06.867475200 +0800
# +++ gene-2.bed 2021-05-27 15:23:06.867475200 +0800
# @@ -1,22 +1,19 @@
# 1 6206197 6206270 GENE00000025907
# 1 6223599 6223745 GENE00000025907
# 1 6227940 6228049 GENE00000025907
# +1 6222341 6228319 GENE00000025907
# 1 6229959 6230073 GENE00000025907
# -1 6230003 6230005 GENE00000025907
# 1 6233961 6234087 GENE00000025907
# 1 6234229 6234311 GENE00000025907
# 1 6206227 6206270 GENE00000025907
# 1 6227940 6228049 GENE00000025907
# 1 6229959 6230073 GENE00000025907
# -1 6230003 6230073 GENE00000025907
# +1 6230133 6230191 GENE00000025907
# 1 6233961 6234087 GENE00000025907
# 1 6234229 6234399 GENE00000025907
# 1 6238262 6238384 GENE00000025907
# -1 6214645 6214957 GENE00000025907
# 1 6227940 6228049 GENE00000025907
# 1 6229959 6230073 GENE00000025907
# -1 6230003 6230073 GENE00000025907
# 1 6233961 6234087 GENE00000025907
# 1 6234229 6234399 GENE00000025907
# -1 6238262 6238464 GENE00000025907
# 1 6239952 6240378 GENE00000025907
-
-u
参数给出结果的展示方式(unified diff format,类似git diff), - 前2行给出两个文件的前缀(原始文件为
---
,修改后文件为+++
)与修改时间。 - 第三行给出两个文件的长度。
- 第4行之后为内容变动情况,
空格1
代表没有改变,+1
的+号代表添加,-1
的-号代表删除,+-号相邻代表此行内容改变。
网友评论