请教一个shell中awk的程序
1个回答
展开全部
这个方法真的高!
我也琢磨了一会儿才明白。这其实是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(赋值表达式返回逻辑真)的时候才有输出。
这样,很清楚了吧。
我也琢磨了一会儿才明白。这其实是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
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询