从NCBI上下载了dbSNP150 common的数据,vcf格式,解压后共8G。我只需要chr、start、end、rs id、ref、alt、type、frequency信息,并整理成bed格式。chr、start、end、rs id、ref、alt各自为一个字段,并通过tab隔开,而其它各种信息合并为一个字段,以;分隔。数据量小时,联合使用notepad++替换字符串和Excel处理格式,即可生成各种生信格式。但数据量太大(若是all版本,有20多G),笔记本上不能打开,即便打开操作很卡。
想起用百宝箱式的linux三大命令:grep、sed、awk。没有采用往常的python或R编程。
vcf数据原本就是整理好的,首先选用awk。
但最后一个字段多个信息混杂,且我只取type、source、frequency信息。所以考虑对最后一个字段进行函数操作。有两大类字符串函数:split类和gsub类。该字段里有些信息不全,无法通过split分割成对齐的array,最后选择gsub函数,把所有不需要的信息置换成空。gsub不能用\d \w等转义字符,但可以用[0-9] [a-z]等。注意若想替换-,需要用转义符号[-]。
最后命令如下:
awk -F ‘\t’ ‘{gsub(/RS=[0-9;]|RSPOS=[0-9;]|BuildID=|VP=[0-9a-z];|SAO=0;|SSR=0;|COMMON=1|WGT=1;|INT;|ASP;|VLD;|GENEINFO=[0-9a-zA-Z:-|];|SLO;|R3;|R5;|RV;|VC=|G5;|DIV;|GNO;|G5A;|TOPMED=[0-9.\,e-]*|HD;/,””);print $3,$1,$2,$4”,”$5”,”$8}’ common.vcf > dbSNP.txt
缩小数据量后,还可以考虑用notepad++或UE进一步处理。为了进一步缩小数据量,可以考虑把某些字符替换为缩写。这一步也可以用sed -i在原文里删除或替换。
为了实现实时查找,采用了sqlite数据库,在python下进行rs id查找。起初速度很慢,从大约四千万个snp中查找10个,约15s。后来为rs id建立index,查找速度骤降为0.5s!
这几个linux命令都是专门针对文本文件的逐行处理的,这种特点非常适合大数据的预处理。不需要把所有数据读入内存时,可以采用sqlite数据库存储数据。