grep

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

正则表达式

image.png

  1. 需要强调的是,正则表达式的字符范围包括大小写字母,罗马数字,以及部分符号。
  2. . 表示任何单个字符(换行符外)
  3. [] 对单个字符给出取值范围;[abc]表示abc,[a-f]表a-f中的任意一个字符串。
  4. [^ ],与[]相反,指取值范围以外字符;[^abc]表示非abc
  5. *,前一个字符0或无限延伸;abc*表示,ab,abc,abcc...
  6. +,前一个字符1或无限延伸;abc+表示,abc,abcc,abccc...
  7. ?,前一个字符01次延伸;abc?表示,ab,abc
  8. |,左右表达式任意一个;ab|cd表示,abcd
  9. {m},扩展前一个字符串m次;ab{2}c,表示abbc
  10. {m,n},扩展前一个字符串m n次;ab{1,2}c,表示abc,abbc
  11. ^,表示字符串开头部分;^abc,匹配abc 开头的字符串。
  12. $,匹配字符串结尾;abc$,匹配abc 结尾的字符串。
  13. (),分组标记,内部只可以用|;(abc)表示abc,(abc|def)表示abc, def
  14. \d 数字,等价于[0-9]
  15. \D 非数字。
  16. \w 单词字符,等价于[A-Z], [a-z], [0-9] -。
  17. \W 非单词字符。
  18. \t 制表符。
  19. \n 空行。
  20. \s 空格型内容,如\t, \n等。
  21. \S 非空格。

此外,对于大部分的标志使用时都需要使用 \ 进行转义,以作为正则表达式的通配符。比如

{}, +, ?

正则表达式引擎

image.png

特殊符号

特殊符号 说明
[: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

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

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

image.png
相关命令如上。
需要注意的是,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 的功能。
image.png

转换

image.png

awk

image.png
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 内置变量

image.png
相当于对于 0-9 数字变量的补充。

通过对内置变量进行新的赋值定义,可以拓展awk 的功能。

FS

image.png
可以达到类似awk 参数-F 的效果。

NR

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

  • NR

image.png

  • less -N

image.png

OFS

可以改变输出的字段分隔符。比如本身输出应该是空格,通过设置 OFS 可以修改为制表符。

$ cat example.gtf | awk 'BEGIN{FS="\t"} {print NR,$1} END{print "finished"}' | less -S

image.png

$ cat example.gtf | awk 'BEGIN{FS="\t";OFS="\t"} {print NR,$1} END{print "finished"}' | less -S

image.png

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

image.png

for

awk '{for (condition) {statement} }'
image.png

如果想要将因为for 循环输出的每行的 $1-$3 信息放在同一行,可以使用

$ cat example.gtf | awk '{for(i=1;i<4;i++) {print $i}}' | less -NS | paste - - -

image.png

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

awk 的数学运算

image.png
比如需要对外显子的这两列进行计算。
image.png

$ cat example.gtf | awk '/exon/ {print $5-$4}' | less -S

image.png

练习

练习1

image.png

练习2

image.png

练习3

image.png

练习4

image.png

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

练习5

image.png