如果需要在一个输入文件中获取其奇数行的数据,或者偶数行的数据,再或者隔行取一次数据,对于awk来说,只要简单的一条语句即可完成,很神奇吧!
CodingAnts@ubuntu:~$ seq 10 | awk 'i=!i'
1
3
5
7
9
为了方便起见,这里用seq指令模拟了一个10行的数据,内容分别是1到10,可以看出以上结果已经显示了所有的奇数行了。下面就给大家解读下这个awk指令。
在《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实现只输出偶数行呢?
转载请注明:Coding Ants » awk使用案例:通过awk输出奇数行
seq 10 | awk -v i=1 ‘{i=!i;print i}’
Warning: copy(http://1.gravatar.com/avatar/5f7e118a642e90dbb7c1f151440dbab0?s=36&d=http%3A%2F%2Fwww.letuknowit.com%2Ftopics%2Favatar%2Fdefault.png%3Fs%3D36&r=G) [function.copy]: failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request in /home/letuknow/domains/letuknowit.com/public_html/topics/wp-content/themes/d4/inc/function-opt.php on line 531
写的很好,学习了。
awk打印偶数行: seq 10|awk -v i=1 ‘i=!i’
seq 10|awk ‘!(i=!i)’ 再取反一次就可以输出偶数行了吧。