免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2415 | 回复: 11
打印 上一主题 下一主题

请教:awk {}和{()}的区别 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-11 17:10 |只看该作者 |倒序浏览
awk -F: '{(total+=$3)};END{print "total : " total}' passwd
awk -F: '(total+=$3);END{print "total : " total}' passwd
这两个有什么区别,得出的结果是不一样的。

论坛徽章:
0
2 [报告]
发表于 2009-08-11 17:16 |只看该作者
还真没试过把语句用括号括起来

论坛徽章:
11
金牛座
日期:2015-03-19 16:56:22数据库技术版块每日发帖之星
日期:2016-08-02 06:20:00数据库技术版块每日发帖之星
日期:2016-04-24 06:20:00数据库技术版块每日发帖之星
日期:2016-04-13 06:20:00IT运维版块每日发帖之星
日期:2016-04-13 06:20:00数据库技术版块每日发帖之星
日期:2016-02-03 06:20:00数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00季节之章:春
日期:2015-03-27 15:54:57羊年新春福章
日期:2015-03-27 15:54:37戌狗
日期:2015-03-19 16:56:41数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
3 [报告]
发表于 2009-08-11 17:17 |只看该作者

回复 #1 sghsky 的帖子

直接() 相当于 (){print $0}
{} 就是{}
这就是差别~~

论坛徽章:
0
4 [报告]
发表于 2009-08-11 17:17 |只看该作者
你可以这么认为:
在{}内部的,是awk的处理语句;在{}外部的,是awk是否执行其后{}中处理语句的判断条件。
当判断条件后面{}不存在时,默认为存在一个{print $0}。
total+=$3是一个赋值语句,在{}外面时同样也是个判断条件,如果完成赋值后total为非0,则条件为真。

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
5 [报告]
发表于 2009-08-11 17:18 |只看该作者
在这里() 是多余的,而{}是必需的。

论坛徽章:
0
6 [报告]
发表于 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

论坛徽章:
0
7 [报告]
发表于 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

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
8 [报告]
发表于 2009-08-11 17:42 |只看该作者
pattern{action}
在{}里面都是action吧。

这里所说的()只是expression 用来改变运算顺序的。

论坛徽章:
0
9 [报告]
发表于 2009-08-11 17:46 |只看该作者

回复 #8 blackold 的帖子

awk '{(cmd)}'

没错啊,{}中的都是action,(cmd)是一个action
我说的是cmd只可能是pattern的形式

论坛徽章:
0
10 [报告]
发表于 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]#
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP