转自:
http://gdcsy.blog.163.com/blog/static/1273436092012727224426/
如果需要在一个输入文件中获取其奇数行的数据,或者偶数行的数据,再或者隔行取一次数据,对于awk来说,只要简单的一条语句即可完成,很神奇吧!
CodingAnts@ubuntu:~$ seq 10 | awk 'i=!i'
1
3
5
7
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}'
1
0
1
0
1
0
1
0
1
0
CodingAnts@ubuntu:~$ seq 10 | awk '1'
1
2
3
4
5
6
7
8
9
10
CodingAnts@ubuntu:~$ seq 10 | awk '0'
留个作业:如何通过awk实现只输出偶数行呢?
阅读(1501) | 评论(0) | 转发(0) |