文本:
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
- 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 ,那么执行一行了。
- awk '{n=split($0,a,"K2345");for(i=1;i<n;i++)print $1,$2,$3}' file
[解析]
把 K2345 当成 FS 来分割每行,最后来根据这个分割的段数来判断打印多少次。
阅读(3469) | 评论(1) | 转发(0) |