免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
2
数据库技术版块每日发帖之星
日期:2015-08-04 06:20:00数据库技术版块每日发帖之星
日期:2015-08-28 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 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需要使用大括号。

请指点一下,谢谢!

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
2 [报告]
发表于 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
3 [报告]
发表于 2015-04-30 10:39 |只看该作者
回复 2# seesea2517


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

论坛徽章:
2
数据库技术版块每日发帖之星
日期:2015-08-04 06:20:00数据库技术版块每日发帖之星
日期:2015-08-28 06:20:00
4 [报告]
发表于 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
5 [报告]
发表于 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
复制代码

论坛徽章:
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
6 [报告]
发表于 2015-05-01 09:50 |只看该作者
回复 1# swenzhao

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP