Chinaunix

标题: 请教:awk {}和{()}的区别 [打印本页]

作者: sghsky    时间: 2009-08-11 17:10
标题: 请教:awk {}和{()}的区别
awk -F: '{(total+=$3)};END{print "total : " total}' passwd
awk -F: '(total+=$3);END{print "total : " total}' passwd
这两个有什么区别,得出的结果是不一样的。
作者: ywlscpl    时间: 2009-08-11 17:16
还真没试过把语句用括号括起来
作者: liaosnet    时间: 2009-08-11 17:17
标题: 回复 #1 sghsky 的帖子
直接() 相当于 (){print $0}
{} 就是{}
这就是差别~~
作者: kwokcn    时间: 2009-08-11 17:17
你可以这么认为:
在{}内部的,是awk的处理语句;在{}外部的,是awk是否执行其后{}中处理语句的判断条件。
当判断条件后面{}不存在时,默认为存在一个{print $0}。
total+=$3是一个赋值语句,在{}外面时同样也是个判断条件,如果完成赋值后total为非0,则条件为真。
作者: blackold    时间: 2009-08-11 17:18
在这里() 是多余的,而{}是必需的。
作者: seeLnd    时间: 2009-08-11 17:26
awk -F: '(total+=$3); END{print "total : " total}' passwd
等同于
awk -F: '(total+=$3){print}; END{print "total : " total}' passwd
等同于
awk -F: '{ if ((total+=$3) != 0) print }; END{print "total : " total}' passwd
作者: ywlscpl    时间: 2009-08-11 17:36
这里讨论awk '{(cmd)}'的形式,以前从未考虑过{}中的语句加括号的问题
  1. [root@Mylinux tmp]# echo -e "1 2 3\n1 2 3"| awk '{(s+=$1)}END{print s}'
  2. 2
  3. [root@Mylinux tmp]# echo -e "1 2 3\n1 2 3"| awk '{(print)}END{print s}'     
  4. awk: {(print)}END{print s}
  5. awk:   ^ syntax error
  6. awk: {(print)}END{print s}
  7. awk:         ^ syntax error
  8. [root@Mylinux tmp]# echo -e "1 2 3\n1 2 3"| awk '{(pp)}END{print s}'   

  9. [root@Mylinux tmp]#
复制代码


可以看出awk '{(cmd)}'形式,cmd不能为一个action,只能是一个pattern,var=xxx这种形式也是一个特殊的pattern
作者: blackold    时间: 2009-08-11 17:42
pattern{action}
在{}里面都是action吧。

这里所说的()只是expression 用来改变运算顺序的。
作者: ywlscpl    时间: 2009-08-11 17:46
标题: 回复 #8 blackold 的帖子
awk '{(cmd)}'

没错啊,{}中的都是action,(cmd)是一个action
我说的是cmd只可能是pattern的形式
作者: ywlscpl    时间: 2009-08-11 17:51
标题: 回复 #8 blackold 的帖子
  1. [root@Mylinux tmp]# echo -e "1 2 3\n1 2 3"| awk '{($1 $2)}END{print s}'

  2. [root@Mylinux tmp]# echo -e "1 2 3\n1 2 3"| awk '{("xyz")}END{print s}'     

  3. [root@Mylinux tmp]#
复制代码


这里()中的$1  $2和"xyz",awk都认为是字符串
其中awk '{($1 $2)}END{print s}'就是awk '{("1 2")}END{print s}'
  1. [root@Mylinux tmp]# echo -e "1 2 3\n1 2 3"| awk '{("1 2")}END{print s}'   

  2. [root@Mylinux tmp]#
复制代码

作者: blackold    时间: 2009-08-11 17:59
标题: 回复 #9 ywlscpl 的帖子
嗯,确实要研究研究awk中的()。
作者: sghsky    时间: 2009-08-11 18:58
大家的回复让我学到很多东西,谢谢各位大虾了




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2