文本:
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
- 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的话就是跳转到行尾。
- awk '/\<K/{print $1,gensub(/.*(\<K[^ ]*).*/,"\\1","g",$0);next}{print $1,"none"}' file
[解析]
这是awk的写法,匹配到边界K开头的用gensub()函数筛选出K开头的单词,然后打印,next不执行后面,如果不匹配到K开头的单词,就打印第一字段和 none。结果和sed没有任何差别。
阅读(1333) | 评论(0) | 转发(0) |