免费注册 查看新帖 |

Chinaunix

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

【awk数据归类】求expert1解释~ [复制链接]

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
11 [报告]
发表于 2011-11-18 16:25 |只看该作者
本帖最后由 cjaizss 于 2011-11-18 16:56 编辑

  1. #!/bin/awk -f
  2. {
  3.         a[$1]=a[$1]" "$2;
  4.         b[$1]=strtonum($1);
  5. }
  6. END{
  7.         x=asort(b);
  8.         for(i=1;i<=x;i++) {
  9.                 $0=a[b[i]];
  10.                 delete c;
  11.                 for(j=1;j<=NF;j++)
  12.                         c[j]=strtonum($j);
  13.                 printf("%d\t",b[i]);
  14.                 y=asort(c);
  15.                 for(j=1;j<=y;j++) {
  16.                         if(j==1){
  17.                                 printf("%d",c[j]);
  18.                                 d=c[j];
  19.                         } else if(c[j]>c[j-1]+1) {
  20.                                 if(c[j-1]==d)
  21.                                         printf(",%d",c[j]);
  22.                                 else
  23.                                         printf("-%d,%d",c[j-1],c[j]);
  24.                                 d=c[j];
  25.                         }

  26.                 }
  27.                 if(d<c[y])
  28.                         printf("-%d",c[y]);
  29.                 printf("\n");
  30.         }
  31. }

复制代码

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
12 [报告]
发表于 2011-11-18 16:51 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
13 [报告]
发表于 2011-11-18 17:40 |只看该作者
回复 10# expert1


    恩,谢谢,这么看确实是清晰了,但是把p1=$1和p2=$2挪到前面了,我执行了一下,结果变了,就拿你的例子来说,输出结果变成:
   
    ,20,21,30,40

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
14 [报告]
发表于 2013-09-13 16:56 |只看该作者
回复 13# SlowLaris


    不好意思,之前一直没仔细看这个问题,今天无意中翻起来,又认真思考了一下,写了下边的,但有点冗余,但比那个容易理解多了。思路完全一样。
  1. awk 'NR==1{p1=$1;p2=$2;s=$1"\t"$2}NR>1{

  2.         if($1==p1){
  3.                 if($2==p2+1){
  4.                         s=s"-"$2
  5.                                         }else{
  6.                        
  7.                         s=s","$2}
  8.                        
  9.                         p1=$1;p2=$2
  10.         }else {
  11.                         gsub(/-[^,]*-/,"-",s);print s;
  12.                
  13.                         p1=$1;p2=$2;
  14.                         s=$1"\t"$2
  15.                         }
  16.                        
  17.         }END{gsub(/-[^,]*-/,"-",s);
  18.        
  19.                 print s}'
  20.                
  21.                
  22. 解释,读取第一行的时候,分别赋值p1,p2,和s
  23.           第二行,判断第一行是否相等,假如yes,那么判断
  24.                                                                    是否连续,是的话,-连接,否则,连接
  25.                                                                    那么第一行p1=4056,p=98,第二行,p1相等,p2不连续,7717 78,198
  26.                                                                    之后p1=4056;p2=198
  27.                                                                   
  28.                 此时第一列不等,那么p1,p2分别要赋新的值,然后把之前的格式化后打印(gsub)。此时必须要把s重新赋值,否则s还是之前的4056 78,198不变。
  29.                
  30.                 因为下一行打印上1或几行(合并之后),那么最后要有个end把最后一次的打印出来。
复制代码

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
15 [报告]
发表于 2013-09-22 17:12 |只看该作者
http://bbs.chinaunix.net/thread-4098548-2-1.html

在这里19楼我发了贴,其实是一类问题。这个先sort -k1,1 -k2n ,由于坐标中$2<$3是成立的。所以
  1. awk 'NR==1{tag=$1;start=$2;end=$3}NR>1{

  2.         if($1==tag){
  3.                                 if($2<end && $3>=end)

  4.                                 end=$3

  5.                         else if($3<end)next

  6.                         else{                                                      
  7.                         
  8.                                 print tag,start,end;start=$2;end=$3;tag=$1
  9.                                        
  10.                                 }
  11.                         
  12.                         
  13.                 }


  14.         else {                                                   
  15.                 print tag,start,end;tag=$1;start=$2;end=$3  
  16.                      
  17.                         }
  18.                         
  19.         }END{print tag,start,end}'
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP