Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2984560
  • 博文数量: 272
  • 博客积分: 5544
  • 博客等级: 大校
  • 技术积分: 5496
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-08 00:48
个人简介

  每个人都要有一个骨灰级的爱好,不为金钱,而纯粹是为了在这个领域享受追寻真理的快乐。

文章分类

全部博文(272)

文章存档

2015年(2)

2014年(5)

2013年(25)

2012年(58)

2011年(182)

分类: LINUX

2011-11-10 12:35:35

文本:
A A A  K2345 K2342 K2364 K2356 K2345
B B B  K2545 K2342 K0349 K2345
C C C  K2342 K2343 K2344
D D D  K2345 K2342 K2364 K2345

按 K2345 出现的次数打印前面的Title:
A A A 
A A A 
B B B 
D D D 
D D D 





  1. sed -nr ':a;/K2345/{s///;h;s/((\w ){3}).*/\1/p;g;ba}' file
[解析]
对于 sed 计数的问题,一直让人头疼,因为它没有 awk 的语言功能,针对这一题,有多少 K2345 就打印多少标题,关键是怎么来计算有几个 K2345 ,这是很多人的思路,但是这样方向 sed 是无法完成的,因为它无法实现计数。但是换个角度,利用替换成功与否来判断跳转,再替换,简单的说,替换到 K2345 一次,就打印一次 Title,这样就实现了这个需求。
这里一开始固定好标签 :a ,然后尝试去匹配 K2345 ,匹配成功运行花括号里的命令,首先就是把 K2345 替换掉,这里的 s/// 大家可能会有疑问,被替换的目标,就是匹配到的 K2345 。然后 h 拷贝到 hold space 中,再把 Title 取出来打印,这里的 \w 就是“字”,除符号,空格等以外的字符,就是数字或大小写字母。打印后 g 把 hold space 里的内容替换到 hold space 中,这么做的目的就是把 hold space 里的内容换成替换后的结果,方便跳转后的再次匹配,如果匹配到了就继续打印 Title ,如果 ba 跳转后没有替换到 K2345 ,那么执行一行了。





  1. awk '{n=split($0,a,"K2345");for(i=1;i<n;i++)print $1,$2,$3}' file
[解析]
把 K2345 当成 FS 来分割每行,最后来根据这个分割的段数来判断打印多少次。


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

yestreenstars2012-12-18 13:58:18

我也写了一个~
sed 's/  /\n/;:1;/K2345/{P;s///;t1};d'