grep


其中-f 参数非常方便,可以在需要指定多个匹配模式时总是使用-e 选项。
正则表达式

需要强调的是,正则表达式的字符范围包括大小写字母,罗马数字,以及部分符号。. 表示任何单个字符(换行符外)[] 对单个字符给出取值范围;[abc]表示a或b或c,[a-f]表a-f中的任意一个字符串。[^ ],与[]相反,指取值范围以外字符;[^abc]表示非a非b非c。*,前一个字符0或无限延伸;abc*表示,ab,abc,abcc...+,前一个字符1或无限延伸;abc+表示,abc,abcc,abccc...?,前一个字符0或1次延伸;abc?表示,ab,abc。|,左右表达式任意一个;ab|cd表示,ab或cd。{m},扩展前一个字符串m次;ab{2}c,表示abbc。{m,n},扩展前一个字符串m 到n次;ab{1,2}c,表示abc,abbc。^,表示字符串开头部分;^abc,匹配abc 开头的字符串。$,匹配字符串结尾;abc$,匹配abc 结尾的字符串。(),分组标记,内部只可以用|;(abc)表示abc,(abc|def)表示abc, def。\d 数字,等价于[0-9]\D 非数字。\w 单词字符,等价于[A-Z], [a-z], [0-9] 及 -。\W 非单词字符。\t 制表符。\n 空行。\s 空格型内容,如\t, \n等。\S 非空格。
此外,对于大部分的标志使用时都需要使用 \ 进行转义,以作为正则表达式的通配符。比如
{}, +, ?
正则表达式引擎
特殊符号
| 特殊符号 | 说明 |
|---|---|
[:alnum:] |
代表英文大小写字母及数字,亦即 0-9, A-Z, a-z |
[:alpha:] |
代表任何英文大小写字母,亦即 A-Z, a-z |
[:blank:] |
代表空白键与 [Tab] 按键两者 |
[:cntrl:] |
代表键盘上面的控制按键,亦即包括 CR, LF, Tab, Del.. 等等 |
[:digit:] |
代表数字而已,亦即 0-9 |
[:graph:] |
除了空白字节 (空白键与 [Tab] 按键) 外的其他所有按键 |
[:lower:] |
代表小写字母,亦即 a-z |
[:print:] |
代表任何可以被列印出来的字符 |
[:punct:] |
代表标点符号 (punctuation symbol),亦即:” ‘ ? ! ; : # $… |
[:upper:] |
代表大写字母,亦即 A-Z |
[:space:] |
任何会产生空白的字符,包括空白键, [Tab], CR 等等 |
[:xdigit:] |
代表 16 进位的数字类型,因此包括: 0-9, A-F, a-f 的数字与字节 |
示例
# grep默认是区分大小写的,这里将匹配所有的小写字母
$ echo '1234\nabcd' | grep '[a-z]'
# 将匹配所有的数字
$ echo '1234\nabcd' | grep '[0-9]'
# 将匹配所有的数字
$ echo '1234\nabcd' | grep '[[:digit:]]'
# 将匹配所有的小写字母
$ echo '1234\nabcd' | grep '[[:lower:]]'
# 将匹配所有的大写字母
$ echo '1234\nabcd' | grep '[[:upper:]]'
# 将匹配所有的字母和数字,包括0-9,a-z,A-Z
$ echo '1234\nabcd' | grep '[[:alnum:]]'
# 将匹配所有的字母
$ echo '1234\nabcd' | grep '[[:alpha:]]'
sed

sed 自身就是一门编程语言,可以对文本进行强大的修改(增删改查)。

script 有专门的相关的语句模式。

相关命令如上。
需要注意的是,y 命令是一一转换,因此指定的字符需要长度相等。
示例
sed 的script 内容用引号选中,
$ cat readme.txt | sed '1a Welcome to Biotrainee() !'
Welcome to Biotrainee() !
Welcome to Biotrainee() !
This is your personal account in our Cloud.
Have a fun with it.
Please feel free to contact with me( email to jmzeng1314@163.com )
(http://www.biotrainee.com/thread-1376-1-1.html)
进阶
删除空白行
$ sed '/^$/d' readme.txt
Welcome to Biotrainee() !
This is your personal account in our Cloud.
Have a fun with it.
Please feel free to contact with me( email to jmzeng1314@163.com )
(http://www.biotrainee.com/thread-1376-1-1.html)
替换
后面的flag 表示匹配到的行的第几处,默认只替换第一处,使用 g 可以设定替换所有处。
这里养成习惯,使用替换时先输入 s/// 。
$ cat readme.txt | sed 's/is/IS/g'
Welcome to Biotrainee() !
ThIS IS your personal account in our Cloud.
Have a fun with it.
Please feel free to contact with me( email to jmzeng1314@163.com )
(http://www.biotrainee.com/thread-1376-1-1.html)
匹配打印
一般是-n 参数与 script 中的p 结合。
类似grep 的功能。
转换
awk

awk 在读取文本时,会将预定义的 字段分隔符 划分给每个数据字段,并分配一个变量。awk 默认的字段分隔符为任意空白字符(空格或制表符),可以用 -F 参数定义字段分隔符。
$0 代表整个文本行
$1 代表文本中第一个数据字段
...
$NF 代表文本行中的最后一个数据字段
需要注意的是⚠️:当awk 的外部使用双引号时,内部需要使用单引号,以进行区分。一般来说是外单内双。
我们可以利用cat 的函数将内容传递给 awk ,再使用变量$0读取整段内容,或者直接 awk '{print}' xxx.test 。
匹配结构
cat example.gtf | awk -F '\t' '/UTR/ {print $1}' | less -NS
通过以上代码,可以获得以制表符分隔字符串,匹配到UTR 字符的行的第一列信息。
拓展结构
会在中间的 /UTR/ {print $1} 匹配的段落前后,加上需要使用BEGIN 与END 后面的语句。begin 与end 相当于是对awk 的处理进行了先后设定,只有对BEGIN 中的语法对整个文件处理完成后,才会进行下一步。
$ head example.gtf | awk -F '\t' 'BEGIN{print "find UTR"} /UTR/ {print $1} END{print "finished"}'
find UTR
chr1
chr1
finished
awk 内置变量

相当于对于 0-9 数字变量的补充。
FS

可以达到类似awk 参数-F 的效果。
NR

可以打印出行号。需要注意的是,它和 less -N 还是存在区别, NR 打印出来的行号为对应行在整个文件中的原行数,因此它不像前者那样会直接按照顺序列出。(其实内容是一样的,只是记录数字不一样罢了)
- NR

- less -N
OFS
可以改变输出的字段分隔符。比如本身输出应该是空格,通过设置 OFS 可以修改为制表符。
$ cat example.gtf | awk 'BEGIN{FS="\t"} {print NR,$1} END{print "finished"}' | less -S

$ cat example.gtf | awk 'BEGIN{FS="\t";OFS="\t"} {print NR,$1} END{print "finished"}' | less -S
awk 条件与循环
if
awk '{if (condition) {yes} else {no}}' 。
$ cat example.gtf | awk '{if($3=="gene") {print $0} else {print $3 " is not gene"}}' | less -NS

for
awk '{for (condition) {statement} }' 。
如果想要将因为for 循环输出的每行的 $1-$3 信息放在同一行,可以使用
$ cat example.gtf | awk '{for(i=1;i<4;i++) {print $i}}' | less -NS | paste - - -

另外,原来for 循环打印结果,是由于print 会默认打印完内容后打印一个换行符。 也可以通过改变print 的打印方式,来结合awk 语法(ORS)进行修改。
awk 的数学运算

比如需要对外显子的这两列进行计算。
$ cat example.gtf | awk '/exon/ {print $5-$4}' | less -S
练习
练习1
练习2

练习3
练习4

$ head example.gtf | awk 'BEGIN{FS="\t"} {print $9}' | awk '{print $2,$4,$6}' | tr ';' ' ' | sed 's/"//g'
练习5

