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

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

文章分类

全部博文(273)

文章存档

2015年(3)

2014年(5)

2013年(25)

2012年(58)

2011年(182)

分类: LINUX

2011-05-14 14:18:47

内容:     NR     NR%2   
111       1        1
abc       2        0
222       3        1
ddd       4        0
111       5        1
ddd       6        0
111       7        1
fff       8        0
222       9        1
ccc      10        0

结果:
111:
abc
ddd
fff
---
222:
ddd
ccc
---
不难看出文中的111和222类似标签,它们下面的内容才是需要的文本,而且范本很有规律的标签下面是内容,找到这个顺序和特点后我们看看这个命令:

 

  1. awk '{NR%2?x=$0:a[x]=a[x] RS $0}END{for(i in a)print i":"a[i]"\n---"}' file

[解析]

  以NR对2取余数,结果为1的为真执行?后面的action,结果为0的为假执行:后面的action。命令里没有pattern,所有{}里的命令全部执行。awk的执行方式就是逐行匹配执行命令的。
第一行:条件为真,x=111
第二行:条件为假,a[111]="\n"abc
第三行:条件为真,x=222
第四行:条件为假,a[222]="\n"ddd
第五行:条件为真,x=111
第六行:条件为假,a[111]="\n"abc"\n"ddd
第七行:条件为真,x=111
第八行:条件为假,a[111]="\n"abc"\n"ddd"\n"fff
第九行:条件为真,x=222
第十行:条件为假,a[222]="\n"ddd"\n"ccc
END最后执行for循环,数组a里就只有111和222两个元素,当i=111时输出111:"\n"abc"\n"ddd"\n"fff"\n---",i=222时同理。最后得到了想要的结果。

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