免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1534 | 回复: 6

[文本处理] awk模式和行为的疑惑 [复制链接]

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00
发表于 2015-07-23 11:44 |显示全部楼层
问大家几个问题:
第一:[root@localhost ~]# seq 9 | awk '$1==3'
         3
这里的$1==3是模式还是行为呢,如果是模式很好理解,符合这个条件就打印。如果是行为是不是{$1==3{print}}
第二:[root@localhost ~]# seq 9 | awk '$1==3{}'
这个没有报错,但是也没有输出,这个{}在此有什么作用?
第三:[root@localhost ~]# seq 9 | awk '$1==3{print}'
         3
这个和SS大神说的行为默认是{print}一致,可以解释。但是为什么第一问题中没有默认的{print}也可以输出呢?
第四:[root@localhost ~]# seq 9 | awk 'if($1==3){print}'
         awk: if($1==3){print}
         awk: ^ syntax error
         [root@localhost ~]# seq 9 | awk 'if($1==3)print'
         awk: if($1==3)print
         awk: ^ syntax error
         [root@localhost ~]# seq 9 | awk '{if($1==3)print}'
         3
这个报错,按照金枪鱼大神说的,if属于行为也可以解释。那么这个行为怎么理解呢?第一个问题awk '$1==3' ,如果是行为那么为啥可以省略{}呢?
第五:[root@localhost ~]# seq 9 | awk '($1==3)'
        3
        [root@localhost ~]# seq 9 | awk '($1==3)($1==4)'
        1
        2
        3
        4
        5
        6
        7
        8
        9
        [root@localhost ~]# seq 9 | awk '($1==3)($1==4){print}'
        1
        2
        3
        4
        5
        6
        7
        8
        9
这个没有报错,有输出,那么这个()在此有什么作用呢,同样的问一下,这个算是行为还是模式呢?
刚开始接触awk,发现很多概念还是理解不清楚,请大神解惑,

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2015-07-23 12:59 |显示全部楼层
本帖最后由 jason680 于 2015-07-23 13:06 编辑

回复 1# 九方流云

awk初学之常见问题
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=2309494&fromuid=24785593

patternaction组合   

1. pattern{action}     <==== 标准组合
  $1==3{print NR,NF,$0}   

2. action缺省 ==> 包含{}的整个{action}缺省
pattern               <== 整个{action}缺省, 同下
pattern{print}     <== print 参数缺省, 同下
pattern{print $0}  <== 以上三者作用(结果)相同

$1==3
$1==3{print}
$1==3{print $0}

注:yinyuemi(SS)大神于 awk初学之常见问题
所说的action缺省指的是包含{}的整个{action}缺省


3. pattern缺省
{action}      <==== 常见组合(pattern缺省 ==> 真(True))

=====================================
{if($1==3)print $0}     <=== $1==3  放在action中{}
$1==3{print $0}         <=== 放在action外(pattern)
$1==3{print}             <=== print 参数缺省
$1==3                       <===整个{action}缺省


==================================
简易判别patternaction方法为
有{}就是action
没有{}就是pattern
注:BEGIN,END是特殊的patternfunction xxx是子程序


论坛徽章:
1
数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00
发表于 2015-07-23 13:30 |显示全部楼层
回复 2# jason680
多谢680大神的回复,很详细,但是恕我愚钝,还有个问题是这样的:
[root@localhost ~]# seq 9 | awk '($1==3)($1==4){print}'
1
2
3
4
5
6
7
8
9
第一个$==3时省略了行为,第二个$1==4有行为,可是全部内容都输出了
[root@localhost ~]# seq 9 | awk '$1==3$1==4{print}'
[root@localhost ~]# seq 9 | awk '$1==3 $1==4{print}'
这两个里面没有输出,可是为什么不是输出3和4 呢
[root@localhost ~]# seq 9 | awk '($1==3){print}($1==4){print}'
3
4
这个是最传统的写法
可能是我太笨了,希望680大神不吝赐教!

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
发表于 2015-07-23 13:58 |显示全部楼层
本帖最后由 MMMIX 于 2015-07-23 14:02 编辑
九方流云 发表于 2015-07-23 13:30
[root@localhost ~]# seq 9 | awk '($1==3)($1==4){print}'

($1==3)($2==4) 整体被作为 pattern, 而且其值始终不为假(00, 10, 或 01).

[root@localhost ~]# seq 9 | awk '$1==3$1==4{print}'
[root@localhost ~]# seq 9 | awk '$1==3 $1==4{print}'

这两个都是语法错误 (gawk 4.1)

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2015-07-23 14:02 |显示全部楼层
本帖最后由 jason680 于 2015-07-23 14:05 编辑

回复 3# 九方流云

签名: 程序是 依照写出来(的code),跑出结果 不是依照你想出来的,得到结果

1. 错误: 你想出来的....
>>第一个$==3时省略了行为第二个$1==4有行为,...
$ seq 9 | awk '($1==3)($1==4){print}'
注:只有最后一个pattern与action的action可缺省

2. 写出来,跑出结果
$ seq 9 | awk '($1==3)($1==4){print}'
这是错用的语法,不说明(语法虽是合法,但不是你想要的结果...)
注:pattern是($1==3)($1==4), action是{print}

3. 你要学习正确想法写出正确的语法...
$ seq 9 | awk '$1==3$1==4{print}'
awk: $1==3$1==4{print}
awk:        ^ syntax error

$ seq 9 | awk '$1==3 $1==4{print}'
awk: $1==3 $1==4{print}
awk:         ^ syntax error

注:以上都是对的想法....
但没有学习正确用法,导致错误的语法...

4. 学习正确的语法
pattern中有二个条件以上时......用and(&&)或 or(||)
$ seq 9 | awk '$1==3||$1==4{print}'
3
4

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00
发表于 2015-07-23 14:17 |显示全部楼层
回复 4# MMMIX
我的awk版本是3.1.7的,太落后了,所以没有报错,确实应该将($1==3)($1==4)看做一个整体模式,而且应该$1==3||$1==4写,

   

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00
发表于 2015-07-23 14:21 |显示全部楼层
回复 5# jason680
已经豁然开朗,多谢大神了,
另:这个签名的含义很深刻,学习了。

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP