1、生物信息学基础教程第第4讲:正则表示式教程讲:正则表示式教程正则表示式与模式匹配正则表示式与模式匹配1/38本节内容本节内容n正则表示式n正则表示式定义与表示方法n正则表示式中元字符(metacharacter)nVIM编辑器ngrep命令nsed编辑器nawk工具2/38正则表示式n所谓正则表示式(regular expression,RE),指是符合某种模式字串,惯用于从文件中或者字符串中查找和替换一些符合某种规则字串3/38VIM教程linux下最惯用文本编辑器4/38VIM编辑器n三种模式:各种模式之间切换n从命令行模式到插入模式:按下i键n从命令行模式到附加模式:按下a键n返回命令行
2、模式:按下ESC键n退出编辑n保留并退出:在命令行模式按下:wqn不保留退出:在命令行模式按下:q!n保留:在命令行模式按下:wn另存为其它文件名:按下:w filename5/38VIM编辑功效n光标跳到文件头:命令行模式下按2下gn光标跳到文件尾:按下:$n光标跳到行首:按下n光标跳到行末:按下$n跳到100行:按下100g6/38VIM查找功效n底行模式下输入/pattern/回车,对应符合pattern文本就会显示为高亮n底行模式下输入:m,n/pattern/,就会在第m行到第n行查找pattern并高亮显示7/38grep教程教程正则表示式应用8/38grep介绍n是Global
3、search regular expression(RE)and Print out the line缩写n强大文本搜索工具,使用正则表示式搜索文本,并打印匹配行n在一个或者多个文件中搜索字符串模式,搜索结果输出到屏幕,不影响文件内容9/38grep使用方法ngrep option pattern input_files10/38惯用惯用grep命令选项命令选项-?n?为数值,同时显示匹配行前后?行ngrep-2 grep test.txt同时显示匹配行前后2行-cn-count,只打印匹配行行数,而不输出匹配行-f file从输入文件中提取模式-i-ignore-case,忽略大小写-q-q
4、uiet,取消显示-ln仅打印匹配模式文件清单-ln打印不匹配模式文件清单-n-line-number,在匹配行前打印行号-s-silent,不显示错误信息-vn-revert-match,只显示不匹配行-wn-word-regexp,假如被引用,就把表示式作为一个单词搜索11/38grep正则表示式元字符正则表示式元字符n锚定行开始ngrep匹配全部以grep开始行$n锚定行结束ngrep$匹配全部以grep结束行.n匹配一个非换行符任意字符ngr.p匹配gr后跟一个任意字符,后为p行*匹配0个或多个先前字符n*grep匹配全部0个或多个空格紧跟grep行n匹配一个指定范围字符nGgrep匹
5、配包含Grep或grep行n匹配不在指定范围内一个字符nA-FH-Zrep匹配全部不在A-F和H-Z范围内字符后跟rep行()n标识匹配字符n(love)中能够匹配love,且love被标识为1n分别锚定一个单词起始和结束n匹配以grep结束单词x5,x5,,x5,10nx恰好重复5次行、最少重复5次行、重复次数在5-10次之间行w=A-Za-z0-9W=A-Za-z0-9n匹配全部单个(非)字母和数字字符bgrepb只匹配单词grep,不匹配egrep等12/38练习题:这些命令都能干啥?1.ls l|grep a2.grep test d*3.grep test aa bb cc4.gre
6、p a-z5 aa5.grep w(es)t.*1 aa6.grep n datafile7.grep 4$datafile8.grep 5.datafile9.grep.5 datafile10.grep wesn datafile11.grep A-ZA-Z A-Z datafile12.grep ss*datafile13.grep a-z9 datafile14.grep datafile13/38sed教程教程非交互性文本编辑非交互性文本编辑14/38sed介绍n首先用which sed查看一下sed位置n一个非交互性文本编辑器,编辑文件或标准输入导出文件拷贝nsed能够随意编辑小文
7、件或者大文件n一次性处理全部改变,高效率n经过行号和正则表示式指定需要编辑行15/38sed使用方法n从文件一个文本行或标准输入中读取数据,并将其拷贝到一个编辑缓冲区n读取命令行或者脚本第一条命令,并用该命令查找模式或定位行号并编辑,重复过程直到命令结束nsed option sed_command input_filensed option f sed_script_file input_filensed_script_file option input_file16/38sed命令选项-nnQuiet,不自动打印编辑行,默认是打印-e下一命令是编辑命令,使用多项编辑时加入此选项-f其后加s
8、ed脚本文件17/38sed定位行号方法 x行号,指定某一行 x,yn指定x-y范围行 xy从第x行开始,每隔y行 /pattern/n查询包含该模式行 x,y!n查询不包含指定行号x和y行18/38基本sed编辑命令p打印匹配行sed n 2,3p test.txtsed n/movie/p temp.txt=显示文件行号sed e/music/=temp.txta在定位行号后附加新文本sed/jack/a“here add new line”p temp.txti在定位行号后插入新文本sed 4 i“here add new line”p temp.txtd删除定位行sed/music/d
9、 temp.txtn从另一个文本中读取下一行,并附加到下一行sed/movie/n temp2.txt temp.txtc用新文本替换定位文本sed 4 c“i like it”temp.txtsn用替换模式替换对应模式sed s/source/okstr/”add before”&/p temp.txtr从另一个文本中读取文本sed/name/r temp2.txt temp.txtw写文本到另一个文件sed s/name/”my”&/w temp2.txt temp.txt19/38练习题:这些命令能干什么?sed s/.$/g temp.txtsed e/abcd/d temp.txts
10、ed s/*/g temp.txtsed s/*/g temp.txtsed s/.*/g temp.txtsed/$/d temp.txtsed s/./g temp.txtsed s/COL()/g temp.txtsed s/g temp.txt20/38AWK教程教程文件模式提取教程文件模式提取教程21/38AWK介绍介绍nLinux下awk有三个版本:awk、nawk、gawk,普通所说awk是指/bin/awk,也就是gawk(GNU awk)nawk功效:n基于指定规则从文件或者字符串中分解抽提信息n基于指定规则输出数据22/38awk三种执行方式1.awk option awk
11、_script input_file1 input_file2 2.将awk_script放入脚本文件并以#!/bin/awk f 作为首行,并赋予该脚本可执行权限,然后在shell下调用该脚本名称执行awk_script内容:awk_file input_file3.将全部awk_script放入一个单独脚本文件,然后用awk f awk_file input_file(s)执行脚本23/38awk脚本组成n可由一条或多条awk_cmd组成,两条awk_cmd之间普通以NEWLINE分割nawk_cmd由两部分组成:awk_pattern actions nawk命令普通形式awk BEGI
12、N actions awk_pattern1 actions awk_patternN actions END actions input_file其中BEGIN 和END模块是可选24/38awk脚本运行机制1.假如存在BEGIN区块,执行其中actions2.从输入文件中读取一行,称为读入一条统计3.将读入统计按照分隔符(FS/IFS)分割为多个字段,依次为$1,$2,.,而$0表示整条统计。4.将当前输入统计与awk_pattern相比较,假如匹配则执行actions,假如不匹配则跳过读入下一条统计,重复执行3,4,直到文件尾5.awk把输入文件数据读入内存,然后操作内存中输入数据副本,
13、不会修改输入文件内容6.awk总是输出到标准输出,假如需要输出到文件,可采取重定向25/38awk_pattern格式1.正则表示式/regexp/通用正则元字符:$.|()*+是awk特有元字符,匹配其前单个字符一次以上?也是awk特有元字符,匹配其前单字符0/1次举例:awk/*$0.0-90-9.*/input_file2.布尔表示式“=”,“”,“/regexp/”,“&”,“|”举例awk$3 /d/input_fileawk($1 10)print ok input_file 26/38actions格式nactions是对awk读取统计进行操作nactions由一条或多条语句或命
14、令组成,语句之间用分号分隔27/38awk命令print“$1=”,$1printf:与c语言printf类似next:读取下一条统计并处理nextfile:读取文件列表下一个文件exit:awk停顿执行并跳出。假如有END存在,awk会执行ENDactions28/38awk语句n赋值语句awk BEGIN x=1;y=3;x=y;print x=x ;y=y awk BEGIN x=3;x+=2;y=x+2;print x=x ;y=y n流程控制结构 if(condition)then-body else else-body while(condition)body do body wh
15、ile(condition)for(initialization;condition;increment)body 与C语言for结构语法相同 break:跳出包含它for、while、do-while 循环 continue:跳过for、while、do-while循环body剩下部分,而立刻进行下一次循环执行29/38awk内部变量n自动内部变量自动内部变量NF:当前输入字段字段数NR:当前输入文件已经被读过行数FNR:全部输入文件中已经被读过行数FILENAME:当前输入文件文件名ARGC:命令行参数个数,输入文件数目+1ARGIND:当前处理文件在ARGV内索引n字段变量:字段变量:$
16、1,$2,$NF,$0n其它内部变量其它内部变量FS:输入统计字段分隔符(默认是空格和制表符)OFS:输出统计字段分隔符(默认是空格)OFMT:数字输出格式(默认是%.6g)RS:输入统计间分隔符(默认是NEWLINE)ORS:输出统计间分隔符(默认是NEWLINE)ARGV:命令行参数数组 ENVIRON:存放系统当前环境变量值数组,它每个组员索引就是一个环境变量名举例:cat/etc/passwd|awk BEGIN FS=:print User name:$1,UID:$4 30/38awk自定义变量n定义变量:varname=valuen表示式中不带引号字符串即被视为变量,假如之前未被
17、赋值,默认值为0或“”n使用方法:awk awk_script awkvar1=value1 awkvar2=value2.input_file n优先级:awk_script中变量定义优先于命令行中变量定义n假如需要调用shell变量,能够采取awk awk_script awkvar1=shellvar1 awkvar2=shellvar2.input_file 31/38awk内置函数n数值函数:int(x),sqrt(x),exp(x),log(x),sin(x),cos(x),atan2(y,x),rand(),srand(x),srand()n字符串函数:index(in,find
18、),length(s),match(s,r),sprintf(),sub(p,r,t),gsub(p,r,t),substr(str,st,len),split(s,a,fs),tolower(str),toupper(str)n系统函数:close(filename),system(command)32/38awk自定义函数n自定义函数格式:function fun_name(param_list)function_body n举例:awk print“sum=”,SquareSum($1,$2)function SquareSum(x,y)sum=x*x+y*y;return sum gr
19、ade.txt33/38awk数组n访问数组元素for(element in array_name)print array_nameelement n举例:awk BEGINprint split(“123#456#789”,mya,“#”);for(i in mya)print myai 34/38防止awk错误方法 确保整个awk_script用单引号括起来 确保awk_script内全部引号成对出现 确保用花括号括起动作语句,用圆括号括起条件语句 可能忘记使用花括号,可能你认为没有必要,但awk不这么认为,将按之解释语法 假如使用字符串,一定要确保字符串被双引号括起来(在模式中除外)35
20、/382)在awk中,设置有意义变量名是一个好习惯,在进行模式匹配或关系操作时更轻易了解。普通变量名设置方式为name=$n3)通常在BEGIN部分给一些变量赋值是很有益,这么能够在awk表示式进行改动时降低很多麻烦4)awk基本功效是依据指定规则抽取输入数据部分内容并输出,另一个主要功效是对输入数据进行分析运算得到新数据并输出,这是经过在 awk_script中对字段变量($1、$2、$3.)重新赋值或使用更大字段变量$n(n大于当前统计NF)而实现5)使用字符串或正则表示式时,有时需要在输出中加入一新行或查询一元字符。这时就需要字符串屏蔽序列。awk中经常使用屏蔽序列有:b 退格键 t t
21、ab键 f 走纸换页 ddd 八进制值 n 新行 r 回车键 c 任意其它特殊字符。eg:为反斜线符号36/38awk输出函数printf 格式:printf(输出模板字符串,参数列表)参数列表是以逗号分隔列表,参数能够是变量、数值或字符串。输出模板字符串字符串中必须包含格式控制符,有几个参数就要求有几个格式控制符。模板字符串中能够只有格式控制符而没有其它字符。格式控制符:%-width.precfmt%:标识一个格式控制符开始,不可省略。-:表示参数输出时左对齐,可省略。width:一个数字,表示参数输出时占用域宽度,可省略。.prec:prec是一个数值,表示最大字符串长度或小数点右边位数
22、,可省略。fmt:一个小写字母,表示输出参数数据类型,不可省略。常见fmt:c ASCII字符,d 整数,e 科学记数法浮点数,f 浮点数,如 123.44 g 由awk决定使用哪种浮点数转换e或f,o 八进制数,s 字符串,x 十六进制数 举例:echo 65|awk printf(%cn,$0)/将打印 A awk BEGINprintf%.4fn,999/将打印 999.0000awk BEGINprintf 2 number:%8.4f%8.2f,999,888/将打印 2 /number:999.0000 888.00037/38总结nsed适合处理整行文本nawk适合处理下面格式文件col1col2col3col4 n更复杂文本可经过结合sed和awk进行处理,或者经过其它更高级脚本语言如perl/python进行处理n记住:C/C+不适适用来处理文本或字符串,所以,掌握1-2种脚本语言对于生物信息学来说,是非常有必要38/38