外显子数据处理笔记 3 ANNOVAR | 注释

学习资料:用annovar对snp进行注释(http://www.bio-info-trainee.com/441.html)
ANNOVAR | 注释(https://www.jianshu.com/p/7607c894eaae)
https://zhuanlan.zhihu.com/p/133832384

下载annovar软件:需要用edu邮箱注册后收到一封来自大佬的下载链接

wget http://www.openbioinformatics.org/annovar/download/0wgxR2rIVP/annovar.latest.tar.gz
tar xvfz annovar.latest.tar.gz
(base) ChengLiangPing@VM-0-8-ubuntu:~$ cd annovar/
(base) ChengLiangPing@VM-0-8-ubuntu:~/annovar$ ll
total 540
drwxr-xr-x  4 ChengLiangPing ChengLiangPing   4096 Dec  6 04:38 ./
drwxr-xr-x 10 ChengLiangPing silou            4096 Feb  2 22:47 ../
-rwxr-xr-x  1 ChengLiangPing ChengLiangPing 226100 Dec  6 04:38 annotate_variation.pl*
-rwxr-xr-x  1 ChengLiangPing ChengLiangPing  42433 Dec  6 04:38 coding_change.pl*
-rwxr-xr-x  1 ChengLiangPing ChengLiangPing 170199 Dec  6 04:38 convert2annovar.pl*
drwxr-xr-x  2 ChengLiangPing ChengLiangPing   4096 Dec  6 04:38 example/
drwxr-xr-x  3 ChengLiangPing ChengLiangPing   4096 Dec  6 04:38 humandb/
-rwxr-xr-x  1 ChengLiangPing ChengLiangPing  19407 Dec  6 04:38 retrieve_seq_from_fasta.pl*
-rwxr-xr-x  1 ChengLiangPing ChengLiangPing  42240 Dec  6 04:38 table_annovar.pl*
-rwxr-xr-x  1 ChengLiangPing ChengLiangPing  21291 Dec  6 04:38 

20200619修改 使用了云服务器后,重新学习了annovar的注释 参考:(http://annovar.openbioinformatics.org/en/latest/user-guide/startup/)

由于可能需要下载snp138等注释数据库,文件比较大下载时间比较长,如果总是掉线会很麻烦。曾老师说是我的电脑设置的问题,我就去搜索了一些设置方法:

  • http://www.361way.com/ssh-autologout/4679.html

  • http://einverne.github.io/post/2017/05/ssh-keep-alive.html

里面提到了关于客户端(自己的笔记本)和服务器端两个不同的设置方案

http://einverne.github.io/post/2017/05/ssh-keep-alive.html

免密登录

查看本地 ~/.ssh/ 目录是否有 id_rsa.pub,如果没有,在本地创建公钥

ssh-keygen -t rsa

然后把本地公钥复制到远程机器的 ~/.ssh/ 目录下,并命名为 authorized_keys

scp ~/.ssh/id_rsa.pub username@hostname:~/.ssh/authorized_keys
# or
ssh-copy-id -i ~/.ssh/id_rsa.pub username@hostname

我本来想尝试用上述代码将之前产生的公钥复制到远程机器的 ~/.ssh/ 目录下,
但是没能成功(可能由于我没有服务器的管理员权限)。因此后面之间在该目录下新建一个文件,完成了免密登录的设置。

在这个过程中发现自己的Linux基础指令相关知识还是很匮乏,需要好好学习一下于是再刷一遍曾老师的B站视频:【生信技能树】生信人应该这样学linux
复习前辈的笔记:linux命令行文本操作一文就够
https://github.com/wzb56/13_questions_of_shell

echo常用参数选项有:

-e: 启用反斜杠控制字符的转换(参考下表)
-E: 关闭反斜杠控制字符的转换(预设如此)
-n: 取消行末的换行符号(与-e选项下的\c字符同意)
关于echo命令所支持的反斜杠控制字符如下表:

转义字符    字符的意义
\a  ALERT / BELL(从系统的喇叭送出铃声)
\b  BACKSPACE, 也就是向左退格键
\c  取消行末之换行符号
\E  ESCAPE, 脱字符键
\f  FORMFEED, 换页字符
\n  NEWLINE, 换行字符
\r  RETURN, 回车键
\t  TAB, 表格跳位键
\v  VERTICAL TAB, 垂直表格跳位键
\n  ASCII 八进制编码(以x开头的为十六进制),此处的n为数字
\   反斜杠本身

Note: 上述表格的资料来自O'Reilly出版社的Learning the Bash Shell, 2nd Ed.

以实例来了解echo的选项及控制字符:

(base) Cheng-MacBook-Pro:chelsea$ echo first line
first line
(base) Cheng-MacBook-Pro:chelsea$ echo -n first line
first line(base) Cheng-MacBook-Pro:chelsea$ echo -n
(base) Cheng-MacBook-Pro:chelsea$ echo -e "a\tb\tc\n\d\te\tf"
a   b   c
\d  e   f
(base) Cheng-MacBook-Pro:chelsea$ echo -e "\141\011\142\011\143\012\144\011\145\011\146"
\141    \142    \143
\144    \145    \146
(base) Cheng-MacBook-Pro:chelsea$ echo -e "\x61\x09\x62\x09\x63\x0a\x64\x09\x65\x09\x66"
a   b   c
d   e   f
(base) Cheng-MacBook-Pro:chelsea$ echo -ne "a\tb\tc\nd\te\bf\a"
a   b   c
d   f(base) Cheng-MacBook-Pro:chelsea$ echo -n
(base) Cheng-MacBook-Pro:chelsea$ 

meta:

  • IFS:有space或者tab或者Enter三者之一组成(我们常用space)
  • CR: 由Enter产生;
    IFS是用来拆解command line中每一个词(word)用的, 因为shell command line是按词来处理的。 而CR则是用来结束command line用的,这也是为何我们敲Enter键, 命令就会跑的原因。

除了常用的IFS与CR, 常用的meta还有:

meta字符作用

= 设定变量
$ 作变量或运算替换(请不要与shell prompt混淆)
> 输出重定向(重定向stdout)
< 输入重定向(重定向stdin)
| 命令管道
& 重定向file descriptor或将命令至于后台(bg)运行
() 将其内部的命令置于nested subshell执行,或用于运算或变量替换
{} 将期内的命令置于non-named function中执行,或用在变量替换的界定范围
; 在前一个命令执行结束时,而忽略其返回值,继续执行下一个命令
&& 在前一个命令执行结束时,若返回值为true,继续执行下一个命令
|| 在前一个命令执行结束时,若返回值为false,继续执行下一个命令
! 执行histroy列表中的命令
... ...

假如我们需要在command line中将这些保留元字符的功能关闭的话, 就需要quoting处理了。
在bash中,常用的quoting有以下三种方法:

  • hard quote:''(单引号),凡在hard quote中的所有meta均被关闭;
  • soft quote:""(双引号),凡在soft quote中大部分meta都会被关闭,但某些会保留(如$);
  • escape: \ (反斜杠),只有在紧接在escape(跳脱字符)之后的单一meta才被关闭;
(base) Cheng-MacBook-Pro:test chelsea$ A="  abc" 
(base) Cheng-MacBook-Pro:test chelsea$ echo $A
abc
(base) Cheng-MacBook-Pro:test chelsea$ echo "$A"
  abc
(base) Cheng-MacBook-Pro:test chelsea$ old_IFS=$IFS
(base) Cheng-MacBook-Pro:test chelsea$ IFS=;
(base) Cheng-MacBook-Pro:test chelsea$ echo $A
  abc
(base) Cheng-MacBook-Pro:test chelsea$ IFS=$old_IFS
(base) Cheng-MacBook-Pro:test chelsea$ echo $A
abc
(base) Cheng-MacBook-Pro:test chelsea$ a=";;;test"
(base) Cheng-MacBook-Pro:test chelsea$ IFS=";"
(base) Cheng-MacBook-Pro:test chelsea$ echo $a
   test
(base) Cheng-MacBook-Pro:test chelsea$ a="   test"
(base) Cheng-MacBook-Pro:test chelsea$ echo $a
   test
(base) Cheng-MacBook-Pro:test chelsea$ IFS=" "
(base) Cheng-MacBook-Pro:test chelsea$ echo $a
test

因为这个;在问题一中的command line上是一个meta, 并非";"符号本身。 因此,IFS=;是将IFS设置为 null charactor (不是space、tab、newline)。
在设定变量的时候,得遵守如下规则:

等号左右两边不能使用分隔符号(IFS),也应避免使用shell的保留元字符(meta charactor);
变量的名称(name)不能使用$符号;
变量的名称(name)的首字符不能是数字(number)。
变量的名称(name)的长度不可超过256个字符。
变量的名称(name)及变量的值的大小写是有区别的、敏感的(case sensitive,)
如下是一些变量设定时常见的错误:

A= B #=号前后不能有IFS
1A=B #变量名称不能以数字开头
$A=B #变量的名称里有$
a=B  #这跟a=b是不同的,(这不是错误,提醒windows用户)

此外若变量被重复定义的话,则原有值为新值所取代。当我们在设定变量的时候,记住这点:用一个名称存储一个数值。

在bash shell中, $()与``(反引号)都是用来做命令替换(command substitution)的。

ChengLiangPing@VM-0-8-ubuntu:~/test$ file=/dir1/dir2/dir3/my.file.txt
ChengLiangPing@VM-0-8-ubuntu:~/test$ ${file#*/}
-bash: dir1/dir2/dir3/my.file.txt: No such file or directory
ChengLiangPing@VM-0-8-ubuntu:~/test$ echo ${file#*/}
dir1/dir2/dir3/my.file.txt
ChengLiangPing@VM-0-8-ubuntu:~/test$ echo ${file#*.}
file.txt
ChengLiangPing@VM-0-8-ubuntu:~/test$ echo ${file##*/}
my.file.txt
ChengLiangPing@VM-0-8-ubuntu:~/test$ echo ${file##*.}
txt
ChengLiangPing@VM-0-8-ubuntu:~/test$ echo ${file%/*}
/dir1/dir2/dir3
ChengLiangPing@VM-0-8-ubuntu:~/test$ echo ${file%.*}
/dir1/dir2/dir3/my.file
ChengLiangPing@VM-0-8-ubuntu:~/test$ echo ${file%%/*}

ChengLiangPing@VM-0-8-ubuntu:~/test$ echo ${file%%.*}
/dir1/dir2/dir3/my

记忆方法:

#是去掉左边(在键盘上#在$的左边);

%是去掉右边(在键盘上%在$的右边);

单个符号是最小匹配;
两个符号是最大匹配;

ChengLiangPing@VM-0-8-ubuntu:~/test$  echo ${file:0:5} #提取最左边的5个字符:/dir1
/dir1
ChengLiangPing@VM-0-8-ubuntu:~/test$ echo ${file:5:5} #提取第5个字符及其右边的5 个字符:/dir2
/dir2

shell字符串取子串的格式:${s:pos:length}, 取字符串s的子串:从pos位置开始的字符(包括该字符)的长度为length的的子串; 其中pos为子串的首字符,在s中位置; length为子串的长度;

Note: 字符串中字符的起始编号为0.

ChengLiangPing@VM-0-8-ubuntu:~/test$ echo ${file/dir/path}  #将第一个dir替换为path:/path1/dir2/dir3/my.file.txt
/path1/dir2/dir3/my.file.txt
ChengLiangPing@VM-0-8-ubuntu:~/test$ echo ${file//dir/path} #将全部的dir替换为path:/path1/path2/path3/my.file.txt
/path1/path2/path3/my.file.txt

shell字符串变量值的替换格式:

  • 首次替换: ${s/src_pattern/dst_pattern} 将字符串s中的第一个src_pattern替换为dst_pattern。

  • 全部替换: ${s//src_pattern/dst_pattern} 将字符串s中的所有出现的src_pattern替换为dst_pattern.

ChengLiangPing@VM-0-8-ubuntu:~/test$ echo ${file-my.file.txt}
/dir1/dir2/dir3/my.file.txt
ChengLiangPing@VM-0-8-ubuntu:~/test$ echo ${file:-my.file.txt}
/dir1/dir2/dir3/my.file.txt
ChengLiangPing@VM-0-8-ubuntu:~/test$ echo ${file:+my.file.txt}
my.file.txt
ChengLiangPing@VM-0-8-ubuntu:~/test$ echo ${file=my.file.txt}
/dir1/dir2/dir3/my.file.txt
ChengLiangPing@VM-0-8-ubuntu:~/test$ echo ${file:=my.file.txt}
/dir1/dir2/dir3/my.file.txt
ChengLiangPing@VM-0-8-ubuntu:~/test$ echo ${file?my.file.txt}
/dir1/dir2/dir3/my.file.txt
ChengLiangPing@VM-0-8-ubuntu:~/test$ echo ${file:?my.file.txt}
/dir1/dir2/dir3/my.file.txt
ChengLiangPing@VM-0-8-ubuntu:~/test$ echo ${#file}
27
ChengLiangPing@VM-0-8-ubuntu:~/test$ A="a b c def"
ChengLiangPing@VM-0-8-ubuntu:~/test$ echo $A
a b c def
ChengLiangPing@VM-0-8-ubuntu:~/test$ A=(a b c def)
ChengLiangPing@VM-0-8-ubuntu:~/test$ echo $A
a
ChengLiangPing@VM-0-8-ubuntu:~/test$ echo ${A[0]}
a
ChengLiangPing@VM-0-8-ubuntu:~/test$ echo ${A[1]}
b
ChengLiangPing@VM-0-8-ubuntu:~/test$ echo ${#A[0]}
1
ChengLiangPing@VM-0-8-ubuntu:~/test$ echo ${#A[4]}
0
ChengLiangPing@VM-0-8-ubuntu:~/test$ echo ${#A[3]}
3
ChengLiangPing@VM-0-8-ubuntu:~/test$ A[4]=xyz
ChengLiangPing@VM-0-8-ubuntu:~/test$ echo ${#A[4]}
3

bash的字符串操作及数组的定义和Python的列表字典的操作方式基本一样。

$(())作用:

在bash中,$(())是用来作整数运算的。

运算符号大致有这些与Python的语法一样:

  • +- * / #分别为"加、减、乘、除"。
  • % #余数运算,(模数运算)
  • & | ^ ! #分别为"AND、OR、XOR、NOT"运算。

例如:

ChengLiangPing@VM-0-8-ubuntu:~/test$ a=5; b=7; c=2;
ChengLiangPing@VM-0-8-ubuntu:~/test$ echo $(( a + b * c ))
19
ChengLiangPing@VM-0-8-ubuntu:~/test$ echo $(( (a + b)/c ))
6
ChengLiangPing@VM-0-8-ubuntu:~/test$ echo $(( (a * b) % c ))
1

此外,$(())还可作不同进制(如二进制、八进制、十六进制)的运算, 只是输出结果均为十进制的。

ChengLiangPing@VM-0-8-ubuntu:~/test$ echo $(( 16#2a )) #输出结果为:42,(16进制 的2a)
42
ChengLiangPing@VM-0-8-ubuntu:~/test$ umask 022
ChengLiangPing@VM-0-8-ubuntu:~/test$ echo "obase=8; $(( 8#666 & (8#777 ^ 8#$(umask)) ))" | bc
644
ChengLiangPing@VM-0-8-ubuntu:~/test$ a=5; ((a++)) #可将$a 重定义为6
ChengLiangPing@VM-0-8-ubuntu:~/test$ echo $a
6
ChengLiangPing@VM-0-8-ubuntu:~/test$ a=5; ((a--)) #可将$a 重定义为4
ChengLiangPing@VM-0-8-ubuntu:~/test$ echo $a
4
ChengLiangPing@VM-0-8-ubuntu:~/test$ a=5; b=7; ((a< b)) #会得到0 (true)返回值。
ChengLiangPing@VM-0-8-ubuntu:~/test$ echo $a
5

shell script的positional parameter

假设my.sh里有一个函数(function)叫my_fun, 若在script中跑my_fun fp1 fp2 fp3, 那么,function内的1是fp1而不是p1了
例如,先写一个脚本

ChengLiangPing@VM-0-8-ubuntu:~/test$ vim my.sh
#!/bin/bash

my_fun() {
    echo '$0 inside function is '$0
    echo '$1 inside function is '$1
    echo '$2 inside function is '$2
}

echo '$0 outside function is '$0
echo '$1 outside function is '$1
echo '$2 outside function is '$2

my_fun fp1 "fp2 fp3"

在运行脚本

ChengLiangPing@VM-0-8-ubuntu:~/test$ chmod 755 my.sh
ChengLiangPing@VM-0-8-ubuntu:~/test$ ./my.sh p1 "p2 p3"
$0 outside function is ./my.sh
$1 outside function is p1
$2 outside function is p2 p3
$0 inside function is ./my.sh
$1 inside function is fp1
$2 inside function is fp2 fp3

在使用positional parameter的时候, 我们要注意一些陷阱:

$10不是替换第10个参数, 而是替换第一个参数,然后在补一个0于其后;

也就是说, my.sh one two three four five six seven eight nine ten 这样的command line, my.sh里的$10不是ten而是one0 哦...小心小心 要抓到ten的话,有两种方法:

  • 方法一:使用${}, 也就是用${10}即可。

  • 方法二:就是shift了。

用通俗的说法来说, 所谓的shift就是取消positional parameter中最左边的参数(1, 而原本的1, 2... 那亲爱的读者,你说要shift掉多少个参数, 才可用{10} 呢? 这个方法好像挺傻的。

shell script中的$@$*

两者只有在soft quote中才有差异, 否则,都表示“全部参数” ($0除外)**。

若在comamnd line上, 跑my.sh p1 "p2 p3" p4的话, 不管$@还是$*, 都可得到 p1 p2 p3 p4就是了。

但是,如果置于soft quote中的话:

$@则可得到"p1" "p2 p3" "p4"这三个不同字段(word);
$*则可得到 "p1 p2 p3 p4"这一整个单一的字段。
我们修改一下前面的my.sh,使之内容如下:

#!/bin/bash

my_fun() {
    echo "$#"
}

echo 'the number of parameter in "$@" is ' $(my_fun "$@")
echo 'the number of parameter in "$*" is ' $(my_fun "$*")

执行结果:

ChengLiangPing@VM-0-8-ubuntu:~/test$ ./my.sh p1 "p2 p3" p4
the number of parameter in "$@" is  3
the number of parameter in "$*" is  1

&&||都是用来"组建" 多个command line用的;

command1 && command2 # command2只有在command1RV0(true)的条件下执行。
command1 || command2 # command2只有在command1的RV为非0(false)的条件下执行。

例如:

ChengLiangPing@VM-0-8-ubuntu:~/test$ A=123
ChengLiangPing@VM-0-8-ubuntu:~/test$ [ -n "$A" ] && echo "yes! it's true."
yes! it's true.
ChengLiangPing@VM-0-8-ubuntu:~/test$ unset A
ChengLiangPing@VM-0-8-ubuntu:~/test$ [ -n "$A" ] && echo "yes! it's true."
ChengLiangPing@VM-0-8-ubuntu:~/test$ [ -n "$A" ] || echo "no, it's Not true."
no, it's Not true.

注:[ -n string ]是测试string长度大于0, 则为true。
上例中,第一个&&命令之所以会执行其右边的echo命令, 是因为上一个test返回了0的RV值; 但第二个,就不会执行,因为test返回了非0的结果... 同理,||右边的echo会被执行,却正是因为左边的test返回非0所引起的。

ChengLiangPing@VM-0-8-ubuntu:~/test$ A=123
ChengLiangPing@VM-0-8-ubuntu:~/test$ [ -n "$A" ] && echo "yes! it's true." || echo "no, it's Not ture."
yes! it's true.
ChengLiangPing@VM-0-8-ubuntu:~/test$ unset A
ChengLiangPing@VM-0-8-ubuntu:~/test$ [ -n "$A" ] && echo "yes! it's true." || echo "no, it's Not ture."
no, it's Not ture.

结合前面的内容查看如下列子

ChengLiangPing@VM-0-8-ubuntu:~/test$ A=123
ChengLiangPing@VM-0-8-ubuntu:~/test$ [ -n "$A" ] && echo "yes! it's true." || echo "no, it's Not ture."
yes! it's true.
ChengLiangPing@VM-0-8-ubuntu:~/test$ unset A
ChengLiangPing@VM-0-8-ubuntu:~/test$ [ -n "$A" ] && echo "yes! it's true." || echo "no, it's Not ture."
no, it's Not ture.
ChengLiangPing@VM-0-8-ubuntu:~/test$ A=123
ChengLiangPing@VM-0-8-ubuntu:~/test$ [ -n "$A" ] && [ "$A" -lt 100 ] || echo 'too big!'
too big!
ChengLiangPing@VM-0-8-ubuntu:~/test$ unset A
ChengLiangPing@VM-0-8-ubuntu:~/test$ [ -n "$A" ] && [ "$A" -lt 100 ] || echo 'too big!'
too big!
ChengLiangPing@VM-0-8-ubuntu:~/test$ unset A
ChengLiangPing@VM-0-8-ubuntu:~/test$ [ -n "$A" ] && ( [ "$A" -lt 100 ] || echo 'too big!' )
ChengLiangPing@VM-0-8-ubuntu:~/test$ unset A
ChengLiangPing@VM-0-8-ubuntu:~/test$ [ -n "$A" ] && { [ "$A" -lt 100 ] || echo 'too big!'}
> ^C

参考资料:https://github.com/wzb56/13_questions_of_shell
有更多介绍

你可能感兴趣的:(外显子数据处理笔记 3 ANNOVAR | 注释)