亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2386 | 回復: 3
打印 上一主題 下一主題

[方向錯了]awk 自定以函數(shù)返回值的問題? [復制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2012-06-14 16:03 |只看該作者 |倒序瀏覽
本帖最后由 jils2013 于 2012-06-15 11:12 編輯

應該是sprintf()和類型轉(zhuǎn)化的問題
因為轉(zhuǎn)化類型為d,所以按照數(shù)字來處理;--我猜可能是處理的數(shù)字大小限制(或者長度限制)
改轉(zhuǎn)化類型為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
復制代碼
所以,問題的結(jié)論個人認為應該是awk處理數(shù)字的精度問題,這也可以解釋,最開始的問題:處理小數(shù)字沒有問題,處理大數(shù)字時缺出現(xiàn)問題;

sprintf()d的解釋:
d, i         接受整數(shù)值并將它轉(zhuǎn)換為有符號的十進制符號表示法。精度指定顯示的最小數(shù)字位數(shù)。如果值轉(zhuǎn)換后可以用更少的位數(shù)來表示,將使用前導零擴展。缺省精度是 1。精度為零的零值轉(zhuǎn)換的結(jié)果是空字符串。用零作為前導字符來指定字段寬度,導致用前導零填充字段寬度值。           

也就是說,我們把一個2進制20多位的數(shù)字字符串傳遞給sprintf時,他會按照這個數(shù)字時十進制去處理,應該是很大的數(shù)字了

-- 開始的問題

前幾天用 awk 的 一個十進制和二進制轉(zhuǎn)換的自定以的函數(shù),較小的數(shù)字沒有問題;

數(shù)字大點的,就會莫名其妙的打印問題:用print 加變量可以正常打印,但是如果直接print 加上函數(shù)執(zhí)行 打印的數(shù)字和正常的小一點;

平臺是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 [報告]
發(fā)表于 2012-06-15 00:01 |只看該作者
直接 return str



function binary(num,str)

str必須成為局部變量,否則污染全局變量

論壇徽章:
0
3 [報告]
發(fā)表于 2012-06-15 09:02 |只看該作者
悲劇了?求解救

論壇徽章:
145
技術(shù)圖書徽章
日期: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技術(shù)圖書徽章
日期: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 [報告]
發(fā)表于 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
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP