学习资料:用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
只有在command1
的RV
为0(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
有更多介绍