免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4898 | 回复: 10

请教关于AWK OFS的问题 [复制链接]

论坛徽章:
2
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00IT运维版块每日发帖之星
日期:2015-08-25 06:20:00
发表于 2011-04-21 17:34 |显示全部楼层
本帖最后由 donggua0713 于 2011-04-21 17:49 编辑

大家好,请大家帮忙看看我的问题:

这个语句,注意有$1=""
awk -v sn=$sn 'BEGIN { FS=",";OFS="@" } { $1=""; if ($2 ~ /^T/) print sn$0 }' $1
返回结果如下:
108985C@T0001@21.1@53.9@11.7@13.2
108985C@T0002@0.2@0.2@1.2@98.4

这个语句,没有$1=""
awk -v sn=$sn 'BEGIN { FS=",";OFS="@" } { if ($2 ~ /^T/) print sn$0 }' $1
108985CCPU01,T0001,21.1,53.9,11.7,13.2
108985CCPU01,T0002,0.2,0.2,1.2,98.4


这是为什么呢?为什么非要在if前面多执行一个语句,OFS才生效呢?但是我需要不下面那个语句的结果啊。


$1源文件 的片段如下:

CPU01,CPU 1 aix2,User%,Sys%,Wait%,Idle%
CPU01,T0001,21.1,53.9,11.7,13.2
CPU01,T0002,0.2,0.2,1.2,98.4
CPU01,T0003,0.2,0.0,0.8,99.0
CPU01,T0004,0.0,0.2,0.4,99.4
CPU01,T0005,0.0,0.2,0.2,99.6
CPU01,T0006,0.4,0.0,0.8,98.8
CPU01,T0007,0.0,0.2,2.0,97.8
CPU01,T0008,0.0,0.0,0.2,99.8
CPU01,T0009,0.4,0.2,0.6,98.8
CPU01,T0010,0.2,0.2,0.8,98.8
CPU01,T0011,0.0,0.2,0.4,99.4
CPU01,T0012,0.0,0.6,0.4,99.0
CPU01,T0013,0.2,0.2,0.8,98.8
CPU01,T0014,0.2,0.6,0.4,98.8
CPU01,T0015,0.4,0.2,0.6,98.8






原来是这样,OFS需要把$0给处理一下之后,才会有改动,如果$0没有处理过,则OFS是不起作用的,所以可以这样:
awk -v sn=$sn 'BEGIN { FS=",";OFS="@" } { $1=$1;if ($2 ~ /^T/) print sn$0 }' splitfile/aix2.CPU01


但是为什么awk需要这么做呢?

论坛徽章:
0
发表于 2011-04-21 17:49 |显示全部楼层
对$1进行赋值后,awk认为$0发生变化了,进行重排,这样设置的OFS就生效了

论坛徽章:
2
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00IT运维版块每日发帖之星
日期:2015-08-25 06:20:00
发表于 2011-04-21 18:00 |显示全部楼层
不是很智能化啊

论坛徽章:
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
发表于 2011-04-21 20:54 |显示全部楼层
是不够智能化。

最好是看一眼电脑,电脑就可以执行命令,之后输出你期望的结果。

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
发表于 2011-04-21 23:49 |显示全部楼层
本帖最后由 yinyuemi 于 2011-04-22 00:01 编辑

回复 3# donggua0713


    呵呵,可能你还有对awk多了解些,有人可能会有下面的需求,从第二行之后,开始使用新的分隔符:
  1. $ echo '108985CCPU01,T0001,21.1,53.9,11.7,13.2
  2. 108985CCPU01,T0002,0.2,0.2,1.2,98.4
  3. 108985CCPU01,T0001,21.1,53.9,11.7,13.2
  4. 108985CCPU01,T0002,0.2,0.2,1.2,98.4' |awk 'BEGIN { FS=",";OFS="@" } NR<=2{print $0;next}{$1=$1;if ($2 ~ /^T/) print "##"$0 }'
  5. 108985CCPU01,T0001,21.1,53.9,11.7,13.2
  6. 108985CCPU01,T0002,0.2,0.2,1.2,98.4
  7. ##108985CCPU01@T0001@21.1@53.9@11.7@13.2
  8. ##108985CCPU01@T0002@0.2@0.2@1.2@98.4
复制代码

论坛徽章:
2
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00IT运维版块每日发帖之星
日期:2015-08-25 06:20:00
发表于 2011-04-22 09:10 |显示全部楼层
是不够智能化。

最好是看一眼电脑,电脑就可以执行命令,之后输出你期望的结果。
blackold 发表于 2011-04-21 20:54



   
我们的终极目标是这样的啦

论坛徽章:
0
发表于 2011-04-22 09:17 |显示全部楼层
回复 6# donggua0713


    我相信,N百年后的计算机系统是这样的,直接读取脑电波信息

论坛徽章:
0
发表于 2011-04-22 10:27 |显示全部楼层
回复  donggua0713


    我相信,N百年后的计算机系统是这样的,直接读取脑电波信息
ywlscpl 发表于 2011-04-22 09:17



   

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
发表于 2011-04-22 10:36 |显示全部楼层
回复 6# donggua0713


    那你就等着失业了,老板都可以搞这些

论坛徽章:
0
发表于 2011-04-22 10:44 |显示全部楼层
回复 8# xiaopan3322


别笑啊,我是认真的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP