Transcript AWK教程

生物信息学基础教程
第4讲:正则表达式教程
——正则表达式与模式匹配
本节内容

正则表达式






正则表达式的定义与表示方法
正则表达式中的元字符(metacharacter)
VIM编辑器
grep命令
sed编辑器
awk工具
正则表达式

所谓正则表达式(regular expression,
RE), 指的是符合某种模式的字串,常
用于从文件中或者字符串中查找和替换
某些符合某种规则的字串
VIM教程
——linux下最常用的文本编辑器
VIM编辑器

三种模式:各种模式之间切换




从命令行模式到插入模式:按下i键
从命令行模式到附加模式:按下a键
返回命令行模式:按下ESC键
退出编辑




保存并退出:在命令行模式按下:wq
不保存退出:在命令行模式按下:q!
保存:在命令行模式按下:w
另存为其他文件名:按下:w filename
VIM编辑功能





光标跳到文件头:命令行模式下按2下g
光标跳到文件尾:按下:$
光标跳到行首:按下^
光标跳到行末:按下$
跳到100行:按下100g
VIM查找功能


底行模式下输入/pattern/回车,对应符合
pattern的文本就会显示为高亮
底行模式下输入:m,n/pattern/,就会在第
m行到第n行查找pattern并高亮显示
grep教程
——正则表达式的应用
grep简介



是Global search regular expression (RE) and Print
out the line的缩写
强大的文本搜索工具,使用正则表达式搜索文
本,并打印匹配的行
在一个或者多个文件中搜索字符串模式,搜索
的结果输出到屏幕,不影响文件内容
grep用法

grep [option] ‘pattern’ input_files
常用grep命令选项
-c
?为数值,同时显示匹配行的前后? grep -2 ‘grep’ test.txt同时显示匹配行的
行
前后2行
--count,只打印匹配行的行数,而
不输出匹配行
-f file
从输入文件中提取模式
-i
--ignore-case,忽略大小写
-q
--quiet,取消显示
-l
仅打印匹配模式的文件清单
-l
打印不匹配模式的文件清单
-n
--line-number,在匹配行前打印行
号
-s
--silent,不显示错误信息
-v
--revert-match,只显示不匹配的行
-w
--word-regexp,如果被\<和\>引用,
就把表达式作为一个单词搜索
-?
grep正则表达式元字符
^
锚定行的开始
‘^grep’匹配所有以grep开始的行
$
锚定行的结束
‘grep$’匹配所有以grep结束的行
.
匹配一个非换行符的任意
字符
‘gr.p’匹配gr后跟一个任意字符,后为p的行
*
匹配0个或多个先前字符
‘*grep’匹配所有0个或多个空格紧跟grep的行
[]
匹配一个指定范围的字符
‘[Gg]rep’匹配包含Grep或grep的行
[^]
匹配不在指定范围内的一
个字符
‘[^A-FH-Z]rep’匹配所有不在A-F和H-Z范围内字符后跟rep的行
\( \)
标记匹配字符
‘\(love\)’中可以匹配love,且love被标记为\1
\< \>
分别锚定一个单词的起始
和结束
‘\<grep’匹配以grep开始的单词
‘grep\>’匹配以grep结束的单词
x\{5\}, x\{5,\},x\{5,10\}
x正好重复5次的行、至少重复5次的行、重复次数在5-10次之
间的行
\w = [A-Za-z0-9]
\W=[^A-Za-z0-9]
匹配所有单个(非)字母和数字字符
\bgrep\b
只匹配单词grep,不匹配egrep等
练习题:这些命令都能干啥?
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
ls –l | grep ‘^a’
grep ‘test’ d*
grep ‘test’ aa bb cc
grep ‘[a-z]\{5\}’ aa
grep ‘w\(es\)t.*\1’ aa
grep ‘^n’ datafile
grep ‘4$’ datafile
grep ‘5\..’ datafile
grep ‘\.5’ datafile
grep ‘^[wesn]’ datafile
grep ‘[A-Z][A-Z] [A-Z]’ datafile
grep ‘ss* ’ datafile
grep ‘[a-z]\{9\}’ datafile
grep ‘\<[a-z].*n\>’ datafile
sed教程
——非交互性文本编辑
sed简介





首先用which sed查看一下sed的位置
一个非交互性文本编辑器,编辑文件或
标准输入导出的文件拷贝
sed可以随意编辑小文件或者大文件
一次性处理所有改变,高效率
通过行号和正则表达式指定需要编辑的
行
sed用法





从文件的一个文本行或标准输入中读取
数据,并将其拷贝到一个编辑缓冲区
读取命令行或者脚本的第一条命令,并
用该命令查找模式或定位行号并编辑,
重复过程直到命令结束
sed [option] ‘sed_command’ input_file
sed [option] –f sed_script_file input_file
sed_script_file [option] input_file
sed命令的选项
-n
Quiet, 不自动打印编辑
行,默认是打印的
-e
下一命令是编辑命令,
使用多项编辑时加入此
选项
其后加sed脚本文件
-f
sed定位行号的方法
x
x, y
x~y
/pattern/
x,y!
行号,指定某一行
指定x-y范围的行
从第x行开始,每隔y行
查询包含该模式的行
查询不包含指定行号x和y的行
基本sed编辑命令
p
打印匹配行
=
显示文件行号
sed –n ‘2,3’p test.txt
sed –n ‘/movie/’p temp.txt
sed –e ‘/music/=’ temp.txt
a\
在定位行号后附加新文本
sed ‘/jack/ \a “here add new line”’p temp.txt
i\
在定位行号后插入新文本
sed ‘4 \i “here add new line”’p temp.txt
d
删除定位行
sed ‘/music/’d temp.txt
n
c\
从另一个文本中读取下一行, sed ‘/movie/n temp2.txt’ temp.txt
并附加到下一行
用新文本替换定位文本
sed ‘4 \c “i like it”’ temp.txt
s
用替换模式替换相应模式
sed ‘s/source/okstr/”add before” &/p’ temp.txt
r
从另一个文本中读取文本
sed ‘/name/r temp2.txt’ temp.txt
w
写文本到另一个文件
sed ‘s/name/”my ” &/w temp2.txt’ temp.txt
练习题:这些命令能干什么?
sed ‘s/\.$//g’ temp.txt
sed –e ‘/abcd/d’ temp.txt
sed ‘s/ */ /g’ temp.txt
sed ‘s/^[][]*//g’ temp.txt
sed ‘s/\.[][]*/[]/g’ temp.txt
sed ‘/^$/d’ temp.txt
sed ‘s/^.//g’ temp.txt
sed ‘s/COL\(…\)//g’ temp.txt
sed ‘s/^\///g’ temp.txt
AWK教程
——文件模式提取教程
AWK简介


Linux下的awk有三个版本:awk、nawk、
gawk,一般所说的awk是指/bin/awk,也
就是gawk (GNU awk)
awk的功能:


基于指定规则从文件或者字符串中分解抽提
信息
基于指定的规则输出数据
awk的三种执行方式
1.
awk [option] ‘awk_script’ input_file1 [input_file2 …]
2.
将awk_script放入脚本文件并以#!/bin/awk –f 作为首
行,并赋予该脚本可执行权限,然后在shell下调用该
脚本名称执行awk_script的内容:awk_file input_file
3.
将所有awk_script放入一个单独的脚本文件,然后用
awk –f awk_file input_file(s)执行脚本
awk脚本的组成



可由一条或多条awk_cmd组成,两条awk_cmd
之间一般以NEWLINE分割
awk_cmd由两部分组成:awk_pattern { actions }
awk命令的一般形式
awk ‘BEGIN { actions } awk_pattern1 { actions } …
awk_patternN {actions} END { actions }’ input_file
其中BEGIN 和END模块是可选的
awk脚本的运行机制
1.
2.
3.
4.
5.
6.
如果存在BEGIN区块,执行其中的actions
从输入文件中读取一行,称为读入一条记录
将读入的记录按照分隔符(FS/IFS)分割为多个字段,
依次为$1,$2,…., 而$0表示整条记录。
将当前输入记录与awk_pattern相比较,如果匹配则
执行actions,如果不匹配则跳过读入下一条记录,
重复执行3,4,直到文件尾
awk把输入文件的数据读入内存,然后操作内存中的
输入数据副本,不会修改输入文件的内容
awk总是输出到标准输出,如果需要输出到文件,可
采用重定向
awk_pattern的格式
1.
正则表达式 /regexp/
①
②
③
通用的正则元字符: [] ^ $ . | () *
+是awk特有的元字符,匹配其前的单个字符一次以上
?也是awk特有的元字符,匹配其前的单字符0/1次
举例:awk ‘/*\$0\.[0-9][0-9].*/’ input_file
2. 布尔表达式 “==”,“>”, “~/regexp/”,“&&”,
“||”
举例
①
awk ‘$3 ~ /[^d]/’ input_file
②
awk '($1 < 10 ) && ($2 > 10) {print "ok"}' input_file
actions的格式


actions是对awk读取记录进行的操作
actions由一条或多条语句或命令组成,
语句之间用分号分隔
awk命令
①
②
③
④
⑤
print “$1= ”, $1
printf:与c语言的printf类似
next:读取下一条记录并处理
nextfile:读取文件列表的下一个文件
exit:awk停止执行并跳出。如果有END存在,
awk会执行END的actions
awk语句

赋值语句
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 }'
流程控制结构

① if (condition) {then-body} [else {else-body}]
② while (condition) {body}
③ do {body} while (condition)
④ for (initialization; condition; increment) {body} 与C语言的for结构的
语法相同
⑤ break : 跳出包含它的for、while、do-while 循环
⑥ continue : 跳过for、while、do-while循环的body的剩余部分,而立
刻进行下一次循环的执行
awk内部变量

自动内部变量
①
②
③
④
⑤
⑥


NF:当前输入字段的字段数
NR:当前输入文件已经被读过的行数
FNR:所有输入文件中已经被读过的行数
FILENAME:当前输入文件的文件名
ARGC:命令行参数个数,输入文件数目+1
ARGIND:当前处理文件在ARGV内的索引
字段变量:$1, $2, …, $NF, $0
其他内部变量
FS : 输入记录的字段分隔符(默认是空格和制表符)
OFS : 输出记录的字段分隔符(默认是空格)
OFMT : 数字的输出格式(默认是 %.6g)
RS : 输入记录间的分隔符(默认是NEWLINE) ORS : 输出记录间的分隔符(默认
是NEWLINE)
⑤
ARGV : 命令行参数数组 ENVIRON : 存储系统当前环境变量值的数组,它的
每个成员的索引就是一个环境变量名
举例:cat /etc/passwd | awk 'BEGIN { FS=":" } {print "User name: "$1,"UID: "$4}'
①
②
③
④
awk自定义变量





定义变量:varname=value
表达式中不带引号的字符串即被视为变量,如
果之前未被赋值,默认值为0或“”
用法:awk 'awk_script' awkvar1=value1
awkvar2=value2 .... input_file
优先级:awk_script中的变量定义优先于命令
行中的变量定义
如果需要调用shell变量,可以采用awk
'awk_script' awkvar1=shellvar1
awkvar2=shellvar2 .... input_file
awk内置函数
数值函数:
int(x), sqrt(x), exp(x), log(x), sin(x), cos(x), atan2(y,x),
rand(), srand(x), srand()
 字符串函数:
index(in, find), 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)
 系统函数:
close(filename), system(command)

awk自定义函数

自定义函数格式:
function fun_name(param_list) { function_body }

举例:
awk ‘{ print “sum=”, SquareSum($1, $2) } function
SquareSum(x,y) { sum=x*x+y*y; return sum }’ grade.txt
awk数组

访问数组元素
for ( element in array_name ) print array_name[element]

举例:
awk ‘BEGIN{print split(“123#456#789”, mya, “#”); for ( i in mya )
{ print mya[i] }}’
避免awk错误的方法
① 确保整个awk_script用单引号括起来
② 确保awk_script内所有引号成对出现
③ 确保用花括号括起动作语句,用圆括号括起条件语句
④ 可能忘记使用花括号,也许你认为没有必要,但awk不
这样认为,将按之解释语法
⑤ 如果使用字符串,一定要保证字符串被双引号括起来
(在模式中除外)
2) 在awk中,设置有意义的变量名是一种好习惯,在进行模式匹配或关系操
作时更容易理解。一般的变量名设置方式为name=$n
3) 通常在BEGIN部分给一些变量赋值是很有益的,这样可以在awk表达式进
行改动时减少很多麻烦
4) awk的基本功能是根据指定规则抽取输入数据的部分内容并输出,另一个
重要的功能是对输入数据进行分析运算得到新的数据并输出,这是通过
在 awk_script中对字段变量($1、$2、$3...)重新赋值或使用更大的字段变
量$n(n大于当前记录的NF)而实现的
5) 使用字符串或正则表达式时,有时需要在输出中加入一新行或查询一元字
符。这时就需要字符串屏蔽序列。awk中经常使用的屏蔽序列有: \b 退格
键 \t tab键 \f 走纸换页 \ddd 八进制值 \n 新行 \r 回车键 \c 任意其他特殊
字符。eg: \\为反斜线符号
awk的输出函数printf
① 格式: printf ("输出模板字符串", 参数列表)
② 参数列表是以逗号分隔的列表,参数可以是变量、数值或字符串。
③ 输出模板字符串的字符串中必须包含格式控制符,有几个参数就要求有
几个格式控制符。模板字符串中可以只有格式控制符而没有其它字符。
④ 格式控制符: %[-][width][.prec]fmt % : 标识一个格式控制符的开始,不可省
略。 - : 表示参数输出时左对齐,可省略。 width : 一个数字,表示参数输
出时占用域的宽度,可省略。 .prec : prec是一个数值,表示最大字符串
长度或小数点右边的位数,可省略。 fmt : 一个小写字母,表示输出参数
的数据类型,不可省略。
⑤ 常见的fmt : c ASCII字符, d 整数 ,e 科学记数法浮点数, f 浮点数,如
123.44 g 由awk决定使用哪种浮点数转换e或f ,o 八进制数, s 字符串, x
十六进制数
⑥ 举例:
echo "65" | awk '{ printf ("%c\n",$0) }' // 将打印 A
awk 'BEGIN{printf "%.4f\n",999}' //将打印 999.0000
awk 'BEGIN{printf "2 number:%8.4f%8.2f",999,888}' // 将打印 2
// number:999.0000 888.000
总结
sed适合处理整行的文本
 awk适合处理下面格式的文件
col1 col2 col3 col4 …
 更复杂的文本可通过结合sed和awk进行处理,
或者通过其他更高级的脚本语言如perl/python
进行处理
 记住:C/C++不适合用来处理文本或字符串,
所以,掌握1-2种脚本语言对于生物信息学来说,
是非常有必要的
