免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: metaxing
打印 上一主题 下一主题

学习随笔:awk点点滴滴01-metaxing [复制链接]

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
11 [报告]
发表于 2008-12-31 08:47 |只看该作者
原帖由 ywlscpl 于 2008-12-31 07:59 发表


#awk -v v1=10.1 -v v2=9.1 'BEGIN{printf("%d %d\n",v1,v2)}'
10 9

#awk -v v1=10.1 -v v2=9.1 'BEGIN{printf "%d %d\n",v1,v2}'
10 9

我一般用第一种,printf格式化输出,返回的不一定是字串,跟 ...

对的。格式化输出

论坛徽章:
0
12 [报告]
发表于 2008-12-31 08:52 |只看该作者

回复 #4 ynchnluiti 的帖子

我这边也不能直接用,要用sprintf

test@erpdataserver ~]$ awk '{$4=sprintf("%f",$4);print}' 1
##10.238.70.19 shuguan172 1 161.000000
#10.238.70.190 shuguan172 1 161.000000
10.238.70.129 shuguan172 1 161.000000
##10.238.70.130 shuguan172 1 161.000000

[test@erpdataserver ~]$ awk '{$4=printf("%f",$4);print}' 1
awk: cmd. line:1: {$4=printf("%f",$4);print}
awk: cmd. line:1:     ^ syntax error

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
13 [报告]
发表于 2008-12-31 08:59 |只看该作者
原帖由 ywlscpl 于 2008-12-31 07:59 发表


#awk -v v1=10.1 -v v2=9.1 'BEGIN{printf("%d %d\n",v1,v2)}'
10 9

#awk -v v1=10.1 -v v2=9.1 'BEGIN{printf "%d %d\n",v1,v2}'
10 9

我一般用第一种,printf格式化输出,返回的不一定是字串,跟 ...


andy 说了半天你怎么还没理解呢?

$ awk 'BEGIN{v=sprintf("%d",1);print v}'
1
$ awk 'BEGIN{v=printf("%d",1);print v}'
awk: cmd. line:1: BEGIN{v=printf("%d",1);print v}
awk: cmd. line:1:         ^ parse error

论坛徽章:
0
14 [报告]
发表于 2008-12-31 09:18 |只看该作者
嗯,是我理解错了,sprintf可以有返回,printf做的只是格式化输出
#echo "1.1 2" | awk '{$1=sprintf("%d",$1);print}'
1 2

论坛徽章:
0
15 [报告]
发表于 2008-12-31 09:21 |只看该作者
代码改成
$Rep_Tools/gawk  'BEGIN {FS=OFS=";"} NR>1{$165=sprintf("%d",$165);$166=sprintf("%d",$166);$167=sprintf("%d",$167);$168=sprintf("%d",$16;$205=sprintf("%d",$205);print}' BTSorg.txt > BTS.txt

论坛徽章:
0
16 [报告]
发表于 2008-12-31 09:29 |只看该作者
恩,这样应该就对了。

论坛徽章:
0
17 [报告]
发表于 2008-12-31 17:01 |只看该作者
非常感谢各位U友,对各位的回复进行测试确认如下:

楼号             UID                        是否实际测试         是否Ok       原因
2楼              jinl                         未实际测试           Nok           根据我对语句理解,是对每个字段都进行了格式转换,这个可能是jinl兄没有注意仅转换指定列的要求!
3,5,9,10,14,15   ywlscpl                  测试15楼代码         Nok          除标题行外,数据列处理ok,但是标题行被丢弃, 所以仅需要再将源文件标题行不经转换原样输出到目标文件就完美了
4,6,8,11             ynchnluiti (andy)   未实际测试            N/A          首先指出printf的错误使用,指明应该使用sprintf
7                        welcome008         未实际测试            N/A       忽略了我对标题行还是需要的,只是不能对其进行转换,所以不可将NR==1;简化
12                      我是DBA                未实际测试            N/A           帮助指正sprintf与printf的差别
13                      ly5066113            未实际测试            N/A           对sprintf与printf的差别给予明确的提示性指正   

经过对15楼的测试,标题行被丢弃
然后对3楼更改printf改为sprintf后进行测试,结果Ok!

最终正确完美结果为:
$Rep_Tools/gawk  'BEGIN {FS=OFS=";"} NR==1;NR>1{$165=sprintf("%d",$165);$166=sprintf("%d",$166);$167=sprintf("%d",$167);$168=sprintf("%d",$16;$205=sprintf("%d",$205);print}' BTSorg.txt > BTS.txt

非常感谢U友的及时解惑,不但解决了问题,也从中了解到print,printf,sprintf之间的部分差别,对于NR变量的理解也更进了一步,更加深了awk指令的使用规则!
对我另一个问题的早日解决也将更加有信息了!

超多字段的文本想使用awk分裂为多个文件,寻求帮助!
http://bbs.chinaunix.net/thread-1344668-1-2.html

论坛徽章:
0
18 [报告]
发表于 2008-12-31 17:05 |只看该作者
metaxing总结的非常细心、耐心

论坛徽章:
0
19 [报告]
发表于 2008-12-31 17:19 |只看该作者

回复 #17 metaxing 的帖子

总结不错,是个好同学,向你学习。

论坛徽章:
0
20 [报告]
发表于 2008-12-31 18:19 |只看该作者
不过又仔细发现,那几个字段绝大多数情况下为0.0 或0.000,但有时候并非如此,发现205列有0.500的情况,为了能够真实获取此数值,又不改变软件,可以通过对原始值放大10倍或者1000倍,后续处理时注意此值实际值应为软件中的值除以10或者1000.
所以又将此行代码改为:
$Rep_Tools/gawk  'BEGIN {FS=OFS=";"} NR==1;NR>1{$165=sprintf("%d",$165*10);$166=sprintf("%d",$166*10);$167=sprintf("%d",$167*10);$168=sprintf("%d",$168*10);$205=sprintf("%d",$205*1000);print}' BTSorg.txt > BTS.txt

哈哈,给自己没事找点事做!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP