为了把时间放在更有意义的事情仩
生信人每天会做大量的重复的操作例如一个流程会用不同的参数跑好几遍找合适的参数,不断把一个格式的数据转换成另一种格式
所以从某种程度而言,wet(和各种试剂打交道)和dry(和计算机打交道)实验人员是差不多的都是有一个想法,然后通过实验进行验证验證的过程中有一部分的探索性的,另一部分是大量的重复性工作
dry相对于wet实验的一个好处就在于可以通过写脚本让计算机去自动化完成那些重复性的工作。另外虽然前面使用管道能够很方便地处理数据,但是由于我们往往不会记录这些过程很容易导致实验不可重复,出叻问题找不到原因因此使用脚本还能对操作进行记录,提高鲁棒性(robust)
由于这个脚本是用于处理mapping-by-sequencing,为了便于实践推荐你们创建如下攵件夹, 并下载SHOREmap提供的demo数据
# 创建项目文件夹目录 # 下载拟南芥参考基因组和注释文件 # 注意中间的空格为"\t"
我会根据我写的一个脚本讲解然后伱们可以根据自己的需求优化这个脚本,写出属于自己的脚本
一般第一个脚本我们都需要运行”hello world“,用来向编程之神祷告让自己能够哽容易的学习编程。在Linux中新建一个hello_world.sh然后输入如下内容。
下面这个脚本是为了帮助我自动完成重测序的工作由于目前用的服务器性能堪憂,8G数据的alignmeng+snp calling的工作需要跑一天时间按照初学时期的做法,就是手动输入命令完成一个阶段的任务然后继续下一个阶段。这极大降低了效率万一程序在半夜完成,你无法马上继续下一阶段;而且不可能时刻盯着你还要其他活要干,所以我写了下面这个初级脚本用来完荿任务
这个脚本存放在script目录下。
所谓良好的开端是成功的一半拖延症主要原因就在于无法开始。无论你知不知道你要写啥建立一个any_name.sh(any name僦是你随便取一个名字,类似于any key)的文件然后把下面4行代码写进去就对了
第1行是shebang,是告知系统用什么解释器来运行这个程序(假设它可執行)第2~3行的目的是让脚本更加“敏感“,默认状态下一行shell脚本会一行一行往下运行即便出错也不会终止,这3行代码就可以及时终止避免rm -rf $NULL/*
的惨剧发生。
写完了开头之后我们就根据自己的预期,将日常中不断重复的工作写到脚本中但是为了脚本具有普遍适用性,所鉯要用到
命令参数就是命令后接的部分例如cat some.file
的命令参数就是some.file。我们可以利用这个功能从外界传入自定义的内容shell脚本以$0,$1,$2,$3..
分别代表命令自身,第一个参数第二个参数,第三个参数等
这里我传入了我项目的根目录和存放样本信息的文件。
在我的脚本其实并没有用到条件语呴毕竟只是第一版,能用就行正常情况下最好加上条件语句,提高脚本的适用性
[条件]可以用bash下的命令,例如
除了bash下的命令外还可鉯用test
或[]
判断条件是否成立,如下
# -f 判断是否为文件
# 或[] 记住里面的左右一定要有空格
《鸟叔的Linux的私房菜》第三版的380页中提高了许多判断方式┅般常用的如下:
一般而言,创建一个pipline处理文件需要三个步骤:
- 使用指定命令处理目标文件
而循环语句就是在选择目标文件后用于重复楿同的指令处理目标文件,还可以记录输出文件
其中选择目标文件有两种方式:1. 提供记录目标文件信息的文本,2.从含目标文件的文件夹內筛选
在将目标文件赋予变量后,就可以使用for循环对目标文件应用相应的命令在我的脚本中,因为bwa
比对软件需要两个输出文件因此僦需要对第一行的内容去重,然后在for循环中添加后缀也就是
方法2比较粗暴,直接利用通配符列出文件
这个脚本的主要目的是完成重测序的任务,目前还不太完善需要注意一下几点:
- 比对的参数需要根据具体情况修改,
- 要求具有特定的目录构造
- 缺少日志信息输出不利於调试
- 后续寻找mutation需要其他程序支持。
用法很简单:提供一个样本信息的文本(三列样本名,R1/R2所在文件目录),和文件的根目录在哪里假设你在scripts下有了sample.txt和mbs.sh,则
最后欢迎到我的星球和我探讨