请教一个shell中awk的程序

seq10|awk'i=!i'为什么是打印奇数行?百思不得其解,盼高手解答!... seq 10 | awk 'i=!i' 为什么是打印奇数行?百思不得其解,盼高手解答! 展开
 我来答
百度网友5311d79
2011-09-09 · TA获得超过1.9万个赞
知道大有可为答主
回答量:6356
采纳率:71%
帮助的人:3146万
展开全部
这个方法真的高!
我也琢磨了一会儿才明白。这其实是C语言赋值表达式的问题(awk中的语法类似于C语法)。
i=0,表达式返回逻辑假,该行不输出
i=1,表达式返回逻辑真,该行输出。
参见最下面的链接,相信你应该可以明白。
在awk中通过逻辑的真假来控制输出与否,这样不断地逻辑翻转,就达到了隔行输出的目的。

在awk中,若变量一开始未初始化则默认为0。
可以做如下试验:
1)seq 10 | awk '0'
逻辑假,没有任何输出
2)seq 10 | awk '1'
逻辑真,全部输出
3)seq 10 | awk '2'
逻辑真,全部输出
4).........
非0即逻辑真,全部输出
5)seq 10 | awk 'i=!i {print($0" "i)}'
可看到只有 i=1(赋值表达式返回逻辑真)的时候才有输出。
6)seq 10 | awk 'BEGIN{i=1} i=!i'
只输出偶数行。同样只有 i=1(赋值表达式返回逻辑真)的时候才有输出。

这样,很清楚了吧。
追问
i没有被定义,所以赋值为0,这个我知道,但后面怎么解释呢?
0=!0?这不还是假吗?再说i几时会被赋值1呢?不一直都是0吗?
麻烦了!
追答
变量只有在做运算(在赋值表达式等号右边)的时候才需要展开替换为对应的值。
在赋值表达式等号左边的时候是不会被展开的,因为你不可能给一个常量赋值。
即第一次 i=!0,表达式值为1(逻辑真);
第二次 i=!1,表达式值为0(逻辑假);
......
i 的值每次都被改变,这样不断逻辑翻转。

你试试看,写成 seq 10 | awk ‘j=!i' 这样就是所有10个数都有输出。
这是因为,第一次 j 被赋值为1,而 i 的值并没有得到改变,此后一直是赋值表达式 j=1,始终是逻辑真。

参考资料: http://zhidao.baidu.com/question/38994653.html

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式