免费注册 查看新帖 |

Chinaunix

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

请教一个AWK问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-05-25 10:24 |只看该作者 |倒序浏览
有一个文本,格式如下:
AA1 20 10.1
AA1 60 9.9
AA1 45 3.3
AA1 72 6.4
AA1 120 8.2
    .
    .
    .
AA9 31 5.5
AA8 91 8.8

注:第二列是日期,最终文本按每30日为一档

想最终产生如下文本:
产品号   30日以下  30-60日  60-90日  90-120日
AA1        1        2         1        1
   .
   .

曾试过使用二维数组来做,但是发现是不是二维数组不支持这种方式,如 sum(AA1,0)

请各位高手帮忙!!!



郁闷外加等待中........

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
2 [报告]
发表于 2006-05-25 10:53 |只看该作者
m=$2/30
sub(/\..*/,"",m)
sum[$1","m]++

另外你那分类有问题吧?60日的可以归到两类里

论坛徽章:
0
3 [报告]
发表于 2006-05-25 11:22 |只看该作者
对waker的崇拜不仅仅停留在shell上
在文学上也开始闪现

我根本没看懂lz的东西。还要看waker的答案猜。

论坛徽章:
0
4 [报告]
发表于 2006-05-25 11:26 |只看该作者
原帖由 shitou9000 于 2006-5-25 11:22 发表
对waker的崇拜不仅仅停留在shell上
在文学上也开始闪现

我根本没看懂lz的东西。还要看waker的答案猜。

斑竹嘛,见识多了,LM惯了,脑壳自然就灵光多了坚决坚持向waker学习shell技术

论坛徽章:
0
5 [报告]
发表于 2006-05-25 12:46 |只看该作者
原帖由 waker 于 2006-5-25 10:53 发表
m=$2/30
sub(/\..*/,"",m)
sum[$1","m]++

另外你那分类有问题吧?60日的可以归到两类里



分类是有问题,应该是 30-60   61-90 91-120
sub(/\..*/."",m)  是不是替换 . 和 *
当将sum[$1","m] 输出时,是不是使用 for ,语句该如何写?

m=$2/30 改为 m=int($2/30)

论坛徽章:
0
6 [报告]
发表于 2006-05-25 13:01 |只看该作者
原帖由 waker 于 2006-5-25 10:53 发表
m=$2/30
sub(/\..*/,"",m)
sum[$1","m]++

另外你那分类有问题吧?60日的可以归到两类里

我也没看懂

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
7 [报告]
发表于 2006-05-25 13:13 |只看该作者

  1. awk '{m=($2-1)/30
  2. sub(/\..*/,"",m)
  3. sum[$1","m]++}
  4. !tmp[$1]++{ind[i++]=$1}
  5. END{print "产品号   30日以下  31-60日  61-90日  91-120日"
  6. for(j=0;j<i;j++)print ind[j],sum[ind[j]","0]+0,sum[ind[j]","1]+0,sum[ind[j]","2]+0,sum[ind[j]","3]+0}' ur-file
复制代码

没测试

[ 本帖最后由 waker 于 2006-5-25 13:16 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2006-05-25 16:35 |只看该作者
原帖由 waker 于 2006-5-25 13:13 发表
[code]
awk '{m=($2-1)/30
sub(/\..*/,"",m)
sum[$1","m]++}
!tmp[$1]++{ind[i++]=$1}
END{print "产品号   30日以下  31-60日  61-90日  91-120日"
for(j=0;j<i;j++)pri ...



谢谢!!已经可以啦!!!


awk 'BEGIN{}
{
        cnt=int($2/30) ;
        bcode[$1]=$1 ;
        cnt_tot[$1,cnt]++ ;
}
END {
        printf("%6.6s  %6.6s  %6.6s  %6.6s \n","code","00-30","31-60","60-90");
        printf("-----------------------------------------------------\n");
        for ( j in bcode )
        {
                printf("%6.6s",j) ;
                for ( i=0;i<3 ; i++)
                {
                        printf("   %4.4d ",cnt_tot[j,i]);
                }
                printf("\n");
        }
}' bb

论坛徽章:
0
9 [报告]
发表于 2006-05-25 18:56 |只看该作者
原帖由 waker 于 2006-5-25 13:13 发表
[code]
awk '{m=($2-1)/30
sub(/\..*/,"",m)
sum[$1","m]++}
!tmp[$1]++{ind[i++]=$1}
END{print "产品号   30日以下  31-60日  61-90日  91-120日"
for(j=0;j<i;j++)pri ...


lz写的看明白了,
waker兄写的没有看懂,不过试过运行没有问题,结果也是正确的.
能否解释一下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP