博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux_以WTCCC数据解密为引谈谈shell脚本自动化中我的一点积累
阅读量:64 次
发布时间:2019-02-25

本文共 3145 字,大约阅读时间需要 10 分钟。

以WTCCC数据解密为引记录一下我在研究shell脚本实现自动化中的一点积累

WTCCC数据介绍

The Wellcome Trust Case Control Consortium (WTCCC) is a group of

50 research groups across the UK which was established in 2005.
The WTCCC aims were to exploit progress in understanding of patterns
of human genome sequence variation along with advances in high-throughput
genotyping technologies, and to explore the utility, design and
analyses of genome-wide association (GWA) studies. The WTCCC has substantially
increased the number of genes known to play a role in the development of
some of our most common diseases and has to date identified approximately 90
new variants across all of the diseases analysed. As well as confirming
many of the known associations, some 28 in total, the WTCCC has also identified
many novel variants that affect susceptibility to disease.

因为博主在读的院校在国内生物信息学方面一直是领先的(自己就不说自己是第一第二了,但第一梯队说出来绝不会有人反驳),所以博主虽然专业是计算机,但研究方向多少也往生信方向偏。也一直在做关于SNP上位效应(epistasis)的研究。(Copyright © . All Rights Reserved)因为通常上位基因(epistatic gene)这方面研究的文献中都会提供两种数据上的实验结果,分别是模拟数据(simulation data)以及 WTCCC上真实疾病样本数据,所以博主在写的论文也不例外。

模拟数据通过限制疾病模型(可加模型或者其他致病模型),MAF(可取0.1,0.2,0.5等),疾病外显率(可取0.2,0.4等)与LD(可取0.7,1.0等)等值,来生成一个模拟数据矩阵。每行代表一个样本,每列代表一个SNP。最后一列为样本是否患病的标志。(Copyright © . All Rights Reserved) 因为不可能获得那么多种组合的真实数据,所以就需要用程序来模拟真实样本。现在博主在模拟数据方面实验已经完成,接下去就需要WTCCC数据的实验结果来支持博主论文的成果了。

WTCCC数据由于是受法律保护的具有版权的国外真实数据,所以申请难度很大。而且本身WTCCC的数据量也不小,我们申请下来的部分足有三百多GB(文本文件压缩状态下,解压后所占空间会指数增长)。并且申请下来后,数据本身是加密状态的,需要WTCCC官方的特殊软件解密。

WTCCC官方的解密软件是用Java写成的,以.jar形式分发,提供两种解密方式和一种随用随取随解密的FUSE方式,两种解密方式都是命令行运行。

WTCCC数据巨大,并且文件的格式对于Windows系统也不甚友好,所以博主选择在Linux系统下进行解密工作,这样对实现脚本自动化也有优势。博主选用的发行版为Ubuntu14.04x64,硬件配置为i7-4790 @ 3.60GHz,8GB DDR3内存。(Copyright © . All Rights Reserved)

对于解密软件解密方式,第一种是命令行进入解密软件的console字符界面,登陆,输入要揭秘的文件路径,输入密钥,解密完成。可以说是相当繁琐的人工劳动。并且我们申请下来的部分足有千余个被加密成二进制形式的文件,一个一个解密不仅耗时耗力,而且容错性不好,解密的人一个疏忽,损坏了一个数据,整体数据集就需要重新下载。并且密钥有有效期,人工解密很有可能到密钥过期都解密不完。所以,必须探索自动化解密方式!这也就引出了第二种解密方式。

第二种方式虽然也是一个一个文件解密,但是并不是进入解密软件的console中去输入命令,(Copyright © . All Rights Reserved)而是通过终端直接向.jar文件中传参。这种方法使自动化解密脚本成为了可能。

至于随用随取随解密的FUSE方式,由于与我们研究数据内容的思路和做法不一致,所以不考虑。这里也不做介绍。

具体的自动化脚本编写

针对第二种解密方式,虽然是一个一个文件解密,但好在提供了参数传递的选项。所以我只需要让shell程序不断调用这个.jar文件,并传入要解密的文件名和路径,即可完成批量自动解压。

核心思路:通过字符串拼接完成我们需要复杂的shell命令。

那么自动传入要解密的文件名和路径呢?答案就是ls+for循环

所以说穿了,原理很简单,路径事先保存为字符串常量,然后通过ls列出该路径下所有需要解密的文件名,然后通过shell脚本编写for循环,每次取ls结果集中的一个文件名,拼接命令字符串,通过eval执行该字符串组成的命令即可。

至于多文件夹批量解压,博主由于比较懒,就十分暴力地复制了数十次shell脚本代码,每个代码对应一套要解密的文件所在的文件夹,只需修改相关的路径字符串常量,最后把所有改好的重复代码集中放在一个.sh脚本文件中,运行这个脚本,shell程序即帮我对每个父文件夹中的每个子文件夹中的每个加密文件开始批量自动解密。接下去的工作只需要让计算机去完成即可。

本次的收获:对shell编程中ifforevalls | grep管道相关、shell编程中的字符串拼接等知识有了一定理解,积累了不少新技能。

最后,照例直接上代码(核心脚本代码):

cmd1="java -jar softwareName.jar -pf login.txt -dc /[path to WTCCC]/[string-partial-omitted]/PART_01/"cmd2=" -dck [decryption key]"for filename in `ls /[path to WTCCC]/PART_01` # use [ls | grep -v -e "filename1" -e "filename2"] or just [ls | grep -v "filename"] to omit files you don't want to process. Copyright © http://blog.csdn.net/s_gy_zetrov. All Rights Reserveddo    cmd=${cmd1}${filename}${cmd2}    #echo $cmd    eval $cmddone

其中login.txt包含账号密码,格式要求为第一行:账号,第二行:密码。

(Copyright © . All Rights Reserved)


visitor tracker

访客追踪插件


你可能感兴趣的文章