免费注册 查看新帖 |

Chinaunix

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

[文本处理] 求指教:awk的大括号问题 [复制链接]

论坛徽章:
2
数据库技术版块每日发帖之星
日期:2015-08-04 06:20:00数据库技术版块每日发帖之星
日期:2015-08-28 06:20:00
发表于 2015-04-30 09:49 |显示全部楼层
例一:
[chengmo@localhost ~]$ awk 'BEGIN{OFMT="%.3f";print 2/3,123.11111111;}'   
0.667 123.111

例二:
echo 20100117054932 | awk 'BEGIN{FIELDWIDTHS="4 2 2 2 2 3"}{print $1"-"$2"-"$3,$4":"$5":"$6}'
2010-01-17 05:49:32

我发现一个问题:
例一中的action部分{OFMT="%.3f";print 2/3,123.11111111;}只有一个大括号,
例二中的action部分{FIELDWIDTHS="4 2 2 2 2 3"}{print $1"-"$2"-"$3,$4":"$5":"$6}是两个大括号。

我尝试把例一改为两个大括号,执行有问题:
[root@localhost ~]# awk 'BEGIN{OFMT="%.3f"}{print 2/3,123.11111111;}'
                       //首先获得空白行,回车后,才能获得第二行数据。
0.667 123.111
                       //这里同第一行的情况。需要回车。
0.667 123.111

0.667 123.111

我把例二改为如下执行:
[root@localhost ~]# echo 20100117054932 | awk 'BEGIN{FIELDWIDTHS="4 2 2 2 2 3";print $1"-"$2"-"$3,$4":"$5":"$6}'
-- ::

结果竟然是这个! 也即使说FIELDWIDTHS="4 2 2 2 2 3"没有生效。

都是awk的内置变量,为何OFMT不需要大括号,而FIELDWIDTHS需要使用大括号。

请指点一下,谢谢!

论坛徽章:
95
CU大牛徽章
日期:2013-11-29 22:26:36CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2014-02-21 14:22:02CU大牛徽章
日期:2014-02-21 14:22:07CU大牛徽章
日期:2014-02-21 14:22:09CU大牛徽章
日期:2015-02-28 17:45:342015元宵节徽章
日期:2015-03-06 16:56:38羊年新春福章
日期:2015-02-28 17:42:522015七夕节徽章
日期:2015-09-14 09:24:55CU大牛徽章
日期:2014-02-21 14:22:44CU大牛徽章
日期:2015-02-28 17:48:12CU大牛徽章
日期:2015-02-28 17:47:58
发表于 2015-04-30 10:35 |显示全部楼层
回复 1# swenzhao


    楼主这个是还不了解awk的程序结构造成的疑惑。awk 的结构是
  1. /模式/ { 脚本 }
复制代码
一个awk 程序里可以有多个上述的结构。其中特殊的模式是 BEGIN 和 END。具体的就不展开了,楼主可以从这个方向去搜索相关的教程和说明查看。

论坛徽章:
2
数据库技术版块每日发帖之星
日期:2015-08-04 06:20:00数据库技术版块每日发帖之星
日期:2015-08-28 06:20:00
发表于 2015-04-30 10:39 |显示全部楼层
回复 2# seesea2517


    感谢提醒,我好好研究一下。

论坛徽章:
2
数据库技术版块每日发帖之星
日期:2015-08-04 06:20:00数据库技术版块每日发帖之星
日期:2015-08-28 06:20:00
发表于 2015-04-30 13:41 |显示全部楼层
本帖最后由 swenzhao 于 2015-04-30 14:10 编辑

又看了一下技术知识,我感觉当有BEGIN时,第一个大括号{}是在awk执行时就加载的比如定义某些参数。第二个大括号是对输入数据的处理。比如例一可以修改为两个大括号:
[root@localhost ~]# awk 'BEGIN{OFMT="%.3f"}{print $1*1,$2*1}' input
0.667 0.444

论坛徽章:
10
2015年亚洲杯之科威特
日期:2015-04-13 13:51:5315-16赛季CBA联赛之山东
日期:2016-01-16 18:35:0815-16赛季CBA联赛之广东
日期:2016-01-04 15:26:23程序设计版块每日发帖之星
日期:2015-11-13 06:20:002015亚冠之阿尔艾因
日期:2015-11-10 12:32:242015亚冠之阿尔沙巴布
日期:2015-05-15 18:26:49羊年新春福章
日期:2015-04-28 16:45:112015年亚洲杯之伊拉克
日期:2015-04-25 20:06:30羊年新春福章
日期:2015-04-13 13:53:2015-16赛季CBA联赛之八一
日期:2016-01-20 18:23:49
发表于 2015-04-30 19:44 |显示全部楼层
BEGIN{}部分是在读取数据前就执行的
{}部分是读取了数据后开始执行的
END{}是数据处理完毕后要执行的操作
所以当你没指定INPUT的时候,
  1. awk 'BEGIN{OFMT="%.3f"}{print 2/3,123.11111111;}'
复制代码
会提示你输入文件名,当然,你没有输入,{}模块就把空作为标准输入,执行完打印,当你输入文件名而回车后,再仔细观察一下
  1. awk 'BEGIN{OFMT="%.3f";FS="-"}{print $1,2/3,123.11111111;}'  

  2. 0.667 123.111
  3. 1-2-3
  4. 1 0.667 123.111
复制代码

论坛徽章:
130
技术图书徽章
日期: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-05-01 09:50 |显示全部楼层
回复 1# swenzhao

awk初学之常见问题
http://bbs.chinaunix.net/thread-2309494-1-1.html
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,8.5折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时8.5折扣期:2019年9月30日前


----------------------------------------

大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP