Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1289614
  • 博文数量: 632
  • 博客积分: 2778
  • 博客等级: 大尉
  • 技术积分: 3387
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-31 09:09
个人简介

123

文章分类

全部博文(632)

文章存档

2014年(36)

2013年(33)

2012年(563)

分类: LINUX

2012-12-12 10:38:41

转自:http://gdcsy.blog.163.com/blog/static/1273436092012727224426/

如果需要在一个输入文件中获取其奇数行的数据,或者偶数行的数据,再或者隔行取一次数据,对于awk来说,只要简单的一条语句即可完成,很神奇吧!
CodingAnts@ubuntu:~$ seq 10 | awk 'i=!i' 
9
  为了方便起见,这里用seq指令模拟了一个10行的数据,内容分别是1到10,可以看出以上结果已经显示了所有的奇数行了。

下面就给大家解读下这个awk指令。

  在中介绍了awk程序指令由模式和操作组成,也就是Pattern{Action}的形式,对比下上面的指令发现,这里只有Pattern,并没有Action,因此这种情形使用默认的Action,也就是输出整条记录(相当于 print $0的效果)。

  在分析这个Pattern之前,需要先介绍下awk中是如何处理未定义变量的,awk中对于未定义变量的处理方式如下:

1. 如果进行数值运算,则赋予初值0

2. 如果进行字符运行,则赋予初值为空字符串

  在了解了awk对于未定义变量的处理方式后,对于Pattern的分析就容易多了,在awk读取第一行数据的时候,会进行模式(Pattern)的匹配,这里的Pattern是一个赋值语句:

i=!i

  读取第一条数据后,进行Pattern匹配的时候,i为一个未定义的变量,按照awk对未定义变量的处理方式,这是i的值为0,那么!i即!0,!为取反,0为假,则!0即为真,因此该赋值语句的结果就是i=!0,即给i赋值为1.

  经过上面的运算后,Pattern可等价为1,而1为真,Pattern匹配成功,输出当前记录。

  读取第二条记录的时候,i=1,i=!i的结果为i=0,因此Pattern为0,Pattern匹配失败,其后读取的内容以此循环以上过程,这样就达到输出奇数行的目的了。

  为了更清楚的了解以上内容,可以自行尝试运行下面的指令,并观察其输出:

CodingAnts@ubuntu:~$ seq 10 | awk '{i=!i;print i}' 
CodingAnts@ubuntu:~$ seq 10 | awk '1' 
10 
CodingAnts@ubuntu:~$ seq 10 | awk '0'

留个作业:如何通过awk实现只输出偶数行呢?

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