Chinaunix首页 | 论坛 | 博客
  • 博客访问: 201566
  • 博文数量: 111
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 790
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-29 13:41
文章分类

全部博文(111)

文章存档

2018年(10)

2017年(27)

2016年(18)

2015年(31)

2014年(25)

分类: LINUX

2014-09-15 16:43:08

内容:     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时同理。最后得到了想要的结果。

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