Chinaunix首页 | 论坛 | 博客
  • 博客访问: 54270
  • 博文数量: 28
  • 博客积分: 84
  • 博客等级: 民兵
  • 技术积分: 162
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-09 17:47
个人简介

try vuuv.github.io or somewhere else.

文章分类

全部博文(28)

文章存档

2013年(1)

2012年(5)

2011年(22)

我的朋友

分类:

2011-10-07 14:55:06

文本:
Ame_R016766     alpha K11583 protein phosphatase
Ame_R013656     H-cadherin (heart); K06808 cadherin 13, H-cadherin
Ame_R018461     NOTCH4; notch 4; K02599 Notch
Ame_R018610     11-LIKE; K12331 Rho guanine
Ame_R015728     gene product from transcrip
 
提取红色部分,如果后面没有K开头的单词,就输出none:
Ame_R016766 K11583
Ame_R013656 K06808
Ame_R018461 K02599
Ame_R018610 K12331
Ame_R015728 none
 
 
  1. sed -rn 's/(Ame_[^ \t]+).*(\<K[^ ]+).*/\1 \2/p;tx;s/(Ame_[^ \t]+).*/\1 none/p;:x' file

[解析]

  这是一个教科书般的案例,通过首先通过扩展正则标记出需要提取的2样数据然后打印,这个tx是关键,t是代表前面语句执行成功就跳转,如果没有执行成功是不跳转的,b则是无论如何都会跳转,这点就充分的显示了b和t的差别,如果成功就跳转去标记x处,也就是行尾,就跳过了后面的替换语句。如果前面的匹配替换不成功,则执行后面替换成 none 的动作。这样就完成了一个简单的条件判断。注:在本案中最后的":x"是可以省略的,前面的tx跳转直接写成t,不申明label的话就是跳转到行尾。

 

 

  1. awk '/\<K/{print $1,gensub(/.*(\<K[^ ]*).*/,"\\1","g",$0);next}{print $1,"none"}' file

[解析]

  这是awk的写法,匹配到边界K开头的用gensub()函数筛选出K开头的单词,然后打印,next不执行后面,如果不匹配到K开头的单词,就打印第一字段和 none。结果和sed没有任何差别。

阅读(504) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~