友情提示:本站最近进行了改版升级,如出现显示异常,请刷新页面或清除一下缓存!

  如果需要在一个输入文件中获取其奇数行的数据,或者偶数行的数据,再或者隔行取一次数据,对于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输出奇数行

相关文章

3访客评论

  1. seq 10 | awk -v i=1 ‘{i=!i;print i}’

    匿名07-03 18:02 回复

  2. 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’

    netcat09-25 09:58 回复
  3. seq 10|awk ‘!(i=!i)’ 再取反一次就可以输出偶数行了吧。

    匿名09-25 10:53 回复

我来说说

(便于我们更好的交流)

没有交流就没有进步,在此输入您对本文的看法!
取消