Almost~最快文本搜索–grep
今天是生信星球陪你的第41天
你想找辆共享单车,发现满街都是别家车,没有一辆你能骑。
你想学点生信,搜了“初学者教程”,满眼尽是高大上,没有一句能看懂。
终于你跨越茫茫宇宙,来到生信星球,发现了初学者的新大陆!
生而为搜——它会在每一行搜索匹配内容:
之前花花介绍过了生信小白第26天–初识文本处理三剑客,初次相遇也许有些陌生,那么今天豆豆带你走近三剑客之一grep 一探究竟
grep的意思是 global search regular expression(RE) and print out the line
regular expression就是正则表达式,之前在再续文本处理三剑客中提到过,今天对这部分内容加一些补充说明
正则表达式:
它的语法结构有两套系统组成,元字符(metacharacters) + 普通字符
那么问题来了:什么是元字符呢?
A: 元字符是表达式的结构,骨架;
比如,“我爱生信星球”这个句子中的主谓宾都是固定的, 也就是它的元字符是固定的;
普通字符可以不同,也就是会有各种语言版本的这句话,来表达我对生信星球的爱
grep模式:
主要有两种,一种基础模式就是grep,一种拓展模式叫做egrep。
egrep的特点就是支持更多的元字符
grep常用参数:
-c 显示有多少行被匹配到(count)
-v 过滤掉某些格式的行
-o 只打印匹配到的内容
-i 忽略匹配字段和匹配内容的大小写
-A/B n: 显示搜索内容前/后 n行
–color=always: 始终高亮显示搜索字段
grep实例练习:
下载数据:
http://www.arabidopsis.org/download_files/Genes/TAIR10_genome_release/TAIR10_gff3/TAIR10_GFF3_genes.gff
-
搜索特定信息
# 搜索基因组注释文件.gff中特定基因信息
grep "AT1G01680" *.gff | head -n5 -
排除特定信息
# 还是搜索这个基因,但排除其中feature项的protein
grep "AT1G01680" *.gff | grep -v "protein" | head -n5 -
查找某段序列并输出上下文
# grep -A n显示后面n行; -B n显示前面n行
# 下载基因组文件wget
http://www.arabidopsis.org/download_files/Genes/TAIR10_genome_release/TAIR10_chromosome_files/TAIR10_chr_all.fas
grep -A 2 "CAAATTGAATTAAG" *.fas
=> 得到下面👇的结果
=> -B的用法你可以试一下 -
查找特定序列并计算出现了几次
grep -c "CAAATTGAATTAAG" *.fas
或者: grep "CAAATTGAATTAAG" *.fas | wc -l
# 如果单纯输出 就用grep -o -
精准匹配某个基因
# 搭配正则表达式
# 比如要匹配开头为AT1G250,结尾为3的基因名
grep "AT1G250.*3$" *.gff
=> 得到了两条AT1G25053 & AT1G25083
-
并非完美~
虽然grep很强大,但是他也并非十全十美,他的一个不足之处就在于,对于存在换行符的字符串,它会搜不到。例如我们想找TAIR10_chr_all.fas 中95-100之内的‘CCACT’ 碱基
先看一下
`tail -n100 TAIR10_chr_all.fas | head -n5`
用肉眼就能看到’CCACT’,但是如果用grep搜索 是没有结果的
tail -n100 TAIR10_chr_all.fas | head -n5 | egrep 'CCACT'
其实稍加改变,用grep还是能实现,就是不那么优雅:
tail -n100 TAIR10_chr_all.fas | head -n5 | tr -d 'n' | egrep 'CCACT'
【tr -d(delete) 是删除特定字段】
所以,有没有什么更快捷的办法呢?有的~可以使用emboss套件下的dreg, 它是针对核酸;如果是氨基酸序列和翻译后的蛋白序列,使用preg
tail -n 1000 chr22.fa | head -n 5 | dreg -filter -pattern 'TAATA'
初学生信,很荣幸带你迈出第一步。
我们是生信星球,一个不拽术语、通俗易懂的生信知识平台。需要帮助或提出意见请后台留言或发送邮件到Bioplanet520@outlook.com~
请关注“恒诺新知”微信公众号,感谢“R语言“,”数据那些事儿“,”老俊俊的生信笔记“,”冷🈚️思“,“珞珈R”,“生信星球”的支持!