免费注册 查看新帖 |

Chinaunix

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

[方向错了]awk 自定以函数返回值的问题? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-06-14 16:03 |只看该作者 |倒序浏览
本帖最后由 jils2013 于 2012-06-15 11:12 编辑

应该是sprintf()和类型转化的问题
因为转化类型为d,所以按照数字来处理;--我猜可能是处理的数字大小限制(或者长度限制)
改转化类型为s,即可避免开始的问题

以下是几个简化的测试
  1. [root@localhost ~]# echo "" | awk '{print sprintf("%020s","100111101010111111");}'
  2. 00100111101010111111
  3. [root@localhost ~]# echo "" | awk '{print sprintf("%020d","100111101010111111");}'
  4. 00100111101010111104
  5. [root@localhost ~]# echo "" | awk '{print sprintf("%020d","10011110101011111111");}'
  6. 10011110101011111936
  7. [root@localhost ~]# echo "" | awk '{print sprintf("%020s","10011110101011111111");}'
  8. 10011110101011111111
  9. [root@localhost ~]# echo "" | awk '{print sprintf("%030d","100111101010111111110");}'
  10. 00000000000000000001.00111e+20
  11. [root@localhost ~]# echo "" | awk '{print sprintf("%030s","100111101010111111110");}'
  12. 000000000100111101010111111110
复制代码
最开始问题的改进后
  1. [root@localhost ~]# echo "" | awk 'function binary(num)
  2.                       {str="";while(num!=0){str=num%2str;num=int(num/2);};return sprintf("%02s",str)}
  3.                     END\
  4.                       {print binary(1624958878)}'  
  5. 1100000110110101110011110011110
  6. [root@localhost ~]# echo "" | awk 'function binary(num)                        
  7.                       {str="";while(num!=0){str=num%2str;num=int(num/2);};return sprintf("%02s",str)}
  8.                     END\
  9.                       {print binary(162495)}'  
  10. 100111101010111111
复制代码
所以,问题的结论个人认为应该是awk处理数字的精度问题,这也可以解释,最开始的问题:处理小数字没有问题,处理大数字时缺出现问题;

sprintf()d的解释:
d, i         接受整数值并将它转换为有符号的十进制符号表示法。精度指定显示的最小数字位数。如果值转换后可以用更少的位数来表示,将使用前导零扩展。缺省精度是 1。精度为零的零值转换的结果是空字符串。用零作为前导字符来指定字段宽度,导致用前导零填充字段宽度值。           

也就是说,我们把一个2进制20多位的数字字符串传递给sprintf时,他会按照这个数字时十进制去处理,应该是很大的数字了

-- 开始的问题

前几天用 awk 的 一个十进制和二进制转换的自定以的函数,较小的数字没有问题;

数字大点的,就会莫名其妙的打印问题:用print 加变量可以正常打印,但是如果直接print 加上函数执行 打印的数字和正常的小一点;

平台是rhel 5.4
  1. [root@localhost shell]# awk --version
  2. GNU Awk 3.1.5
  3. [root@localhost shell]# echo "" | awk 'function binary(num)
  4.                       {str="";while(num!=0){str=num%2str;num=int(num/2);};return sprintf("%0d",str)}
  5.                     END\
  6.                       {binary(162495);print str}'   
  7. 100111101010111111
  8. [root@localhost shell]# echo "" | awk 'function binary(num)
  9.                       {str="";while(num!=0){str=num%2str;num=int(num/2);};return sprintf("%0d",str)}
  10.                     END\
  11.                       {print binary(162495)}'
  12. 100111101010111104
  13. [root@localhost shell]# echo "" | awk 'function binary(num)
  14.                       {str="";while(num!=0){str=num%2str;num=int(num/2);};return sprintf("%0d",str)}
  15.                     END\
  16.                       {print binary(16249)}'
  17. 11111101111001
复制代码

论坛徽章:
1
摩羯座
日期:2014-12-29 15:59:36
2 [报告]
发表于 2012-06-15 00:01 |只看该作者
直接 return str



function binary(num,str)

str必须成为局部变量,否则污染全局变量

论坛徽章:
0
3 [报告]
发表于 2012-06-15 09:02 |只看该作者
悲剧了?求解救

论坛徽章:
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
4 [报告]
发表于 2012-06-15 09:06 |只看该作者
本帖最后由 jason680 于 2012-06-15 09:32 编辑

回复 1# jils2013

return str   

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

$ echo "0" | awk 'function bin(n){s="";do{s=n%2""s;n=int(n/2)}while(n>0);return s}{print bin($1)}'
0

$ echo "1" | awk 'function bin(n){s="";do{s=n%2""s;n=int(n/2)}while(n>0);return s}{print bin($1)}'
1

$ echo "16249500" | awk 'function bin(n){s="";do{s=n%2""s;n=int(n/2)}while(n>0);return s}{print bin($1)}'
111101111111001010011100
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP