免费注册 查看新帖 |

Chinaunix

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

[awk]为数字加上千位符 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-07-02 18:03 |只看该作者 |倒序浏览
希望可以抛砖引玉,能看到犀利的脚本

从左到右,添加逗号
  1. awk -F'.' '{len=length($1);offset=len%3;
  2.                         if( len >= 3 && len%3 != 0 )
  3.                         {
  4.                                 str=substr($1,1,offset )","
  5.                         }
  6.                         for(idx=offset+1;idx<=len-3;idx++)
  7.                         {
  8.                                 if( ( idx - offset -1)% 3 == 0 )
  9.                                 {
  10.                                         str=str""substr($1,idx,3)","
  11.                                 }
  12.                         }
  13.                         if( NF == 2 )
  14.                         {
  15.                                 str=str""substr($1,len-2,3)"."$2
  16.                         }
  17.                         else
  18.                         {
  19.                                 str=str""substr($1,len-2,3)
  20.                         }
  21.                         print str}'
复制代码
从右到左增加逗号,一个字符一个字符的玩!
  1. awk -F'.' '{len=length($1);
  2.                         if( NF == 2 )
  3.                         {
  4.                                 str="."$2;
  5.                         }
  6.                         j=0
  7.                         for( i=len ; i>0; i-- )
  8.                         {
  9.                                 if( j % 3 ==0 && j != 0 )
  10.                                 {
  11.                                         str=","str
  12.                                 }
  13.                                 str=substr($1,i,1)""str
  14.                                 j++;
  15.                         }
  16.                         print str}'
复制代码

论坛徽章:
0
2 [报告]
发表于 2010-07-02 18:14 |只看该作者
学习了

论坛徽章:
0
3 [报告]
发表于 2010-07-02 21:57 |只看该作者
  1. awk '
  2. BEGIN {
  3. FS="."
  4. OFS="."
  5. }

  6. {
  7. "echo " $1 " | rev" | getline i
  8. gsub(/.../,"&,",i)
  9. "echo " i " | rev" | getline i
  10. $1=i
  11. gsub(/.../,"&,",$2)
  12. print $0
  13. }
  14. '
复制代码

论坛徽章:
0
4 [报告]
发表于 2010-07-03 01:07 |只看该作者
如果不是那么坚持AWK的话, 试试用正则来替换吧

  1. huan@nb:~$ seq -s  "" 1 9 | perl -pe 's/(?<=\d)(?=(\d\d\d)+$)/,/g'
  2. 123,456,789
复制代码

论坛徽章:
0
5 [报告]
发表于 2010-07-03 11:29 |只看该作者
$ awk 'BEGIN{printf "%'"'"'d\n",  123456}'
123,456
这样不是更方便?
化成awk脚本是

#!/usr/bin/awk -f

BEGIN{
        printf "%'d\n", 123456
}
可以得到相同的结果

论坛徽章:
0
6 [报告]
发表于 2010-07-03 12:00 |只看该作者
借助于printf
[root@Mylinux tmp]# echo 1234567.01 | awk -F\. '{printf "%'"'"'d%s\n",$1,$2?"."$2:""}'
1,234,567.01

另一种方法
[root@Mylinux tmp]# echo 1234567.01 | awk -v OFS='' -F '' '{n=match($0,/\./)-1;n=n>=0?n:NF;for (i=n;i>0;i--) {j=n-i+1;$i=(j%3||i==1)?$i:","$i}}2'  
1,234,567.01

论坛徽章:
0
7 [报告]
发表于 2010-07-03 13:48 |只看该作者
如果只是整数的话 没有那么复杂啦 不需要awk出场吧
  1. [oracle@s12071 ~]$var=1234567890
  2. [oracle@s12071 ~]$ echo ${var}
  3. 1234567890
  4. [oracle@s12071 ~]$ printf "%'d" ${var}
  5. 1,234,567,890[oracle@s12071 ~]$
复制代码

论坛徽章:
0
8 [报告]
发表于 2010-07-03 14:22 |只看该作者
如果只是整数的话 没有那么复杂啦 不需要awk出场吧
lkk2003rty 发表于 2010-07-03 13:48



    学习了,以前学到的sed的写法
  1. echo "1234567"|sed ':a;s/\B[0-9]\{3\}\>/,&/;ta'
复制代码

论坛徽章:
0
9 [报告]
发表于 2010-07-04 10:10 |只看该作者
学习下

论坛徽章:
0
10 [报告]
发表于 2010-07-04 13:09 |只看该作者
回复 8# where27


    这个不错  谢谢种菜兄分享。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP