免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-18 13:05 |只看该作者 |倒序浏览
  1. 4056 78
  2. 4056 198
  3. 7717 98
  4. 7717 218
  5. 7718 98
  6. 7718 218
  7. 7719 98
  8. 7719 99
  9. 7719 218
  10. 7719 219
  11. 7720 98
  12. 7720 99
  13. 7720 218
  14. 7720 219
  15. 7720 220

  16. 输出:
  17. 4056   78,198
  18. 7717    98,218
  19. 7718    98,218
  20. 7719    98-99,218-219
  21. 7720    98-99,218-220
  22. 第一列是索引号,第二列是一个数组,如果数组的值是连续的,应该用连字符来连接,如果不连续,需要用逗号来连接
  23. 我的思路和下边的脚本类似,但没写出来,下边是别人的,贴出来学习之。
  24. awk '{
  25.     if ($1==p1) {
  26.         if ($2==p2+1)
  27.             s=s"-"$2;
  28.         else
  29.             s=s","$2;
  30.     } else {
  31.         if (NR>1) {
  32.             gsub(/-[^,]*-/,"-",s);
  33.             print s;
  34.         }
  35.         s=$1"\t"$2;
  36.     }
  37.     p1=$1;
  38.     p2=$2;
  39. }
  40. END {
  41.     gsub(/-[^,]*-/,"-",s);
  42.     print s;
  43. }'
复制代码

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
2 [报告]
发表于 2011-11-18 13:07 |只看该作者
每个人都喜欢自己写代码,而非常讨厌解释别人的代码.

论坛徽章:
0
3 [报告]
发表于 2011-11-18 13:07 |只看该作者
在版主expert1的博客看到的,代码太简洁了,简洁到看不懂了......学习别人的思路确实是很难,里面p1和p2看不懂...

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
4 [报告]
发表于 2011-11-18 13:18 |只看该作者
这个代码可以执行的前提是,相同的第一域必须要在一起,并且是按第二域连续.我来写一个可以乱序的吧

论坛徽章:
0
5 [报告]
发表于 2011-11-18 13:23 |只看该作者
回复 4# cjaizss



是,我试过了,这个脚本只限制于第一个域相同且在一起,求指教~

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
6 [报告]
发表于 2011-11-18 13:27 |只看该作者
回复  cjaizss



是,我试过了,这个脚本只限制于第一个域相同且在一起,求指教~
SlowLaris 发表于 2011-11-18 13:23



    其实,你自己可以想像一下如何实现呢,一个很普通的算法吧

论坛徽章:
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
7 [报告]
发表于 2011-11-18 13:32 |只看该作者
回复 1# SlowLaris


简单的思路
7720 98
7720 99
7720 218
7720 219
7720 220

7720 98
     放入 s=$1"\t"$2; ===> 7720 98

7720 99
  $1相同(7720)
  且 99 = 98 +1 ($2==p2+1)
     放入 s=s"-"$2 ===> 7720 98-99

7720 218
  $1相同(7720)
  且 218 ! = 99+1 ;  ($2==p2+1) else
    s=s","$2; ===> 7720 98-99,218

7720 219
  $1相同(7720)
  且 219 = 218 +1 ($2==p2+1)
     放入 s=s"-"$2 ===> 7720 98-99,218-219

7720 220
  $1相同(7720)
  且 220 = 219 +1 ($2==p2+1)
     放入s=s"-"$2 ===> 7720 98-99,218-219-220

最后要输出前把多的 ​​-xxx 去除...
    7720 98-99,218-219-220

       gsub(/-[^,]*-/,"-",s);

论坛徽章:
0
8 [报告]
发表于 2011-11-18 13:38 |只看该作者
本帖最后由 SlowLaris 于 2011-11-18 13:40 编辑

回复 7# jason680


    这么详细,谢谢,但是s=$1"\t"$2为什么要放到else里面???还有p1和p2是什么意思?

论坛徽章:
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
9 [报告]
发表于 2011-11-18 13:45 |只看该作者
回复  jason680


    这么详细,谢谢,但是s=$1"\t"$2为什么要放到else里面???还有p1和p2是什么意思 ...
SlowLaris 发表于 2011-11-18 13:38



置顶文:
  shell基础十二篇
shell基础九:awk
http://bbs.chinaunix.net/thread-448687-1-1.html

1. 但是s=$1"\t"$2为什么要放到最后?
  不知要怎回答你....
  code 你不会,也不是我写的.....你问我,....!@#$%^&*()

  烦请去问原作者吧...

2. 还有p1和p2是什么意思?
   只是保存上次的$1, $2
    p1=$1;
    p2=$2;

论坛徽章:
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
10 [报告]
发表于 2011-11-18 16:11 |只看该作者
回复 1# SlowLaris

sample.txt
100 20
100 21
100 30
200 40



awk '{

    p1=$1;  # first assign the 1st,2nd filed of the file you specified in advancement to 2 variables p1,p2
    p2=$2;

    if ($1==p1) {  
         if ($2==p2+1)
            s=s"-"$2;
        else
            s=s","$2;
    }
else {
        if (NR>1) {
            gsub(/-[^,]*-/,"-",s);
            print s;
        }
        s=$1"\t"$2;
    }

   
}
END {
    gsub(/-[^,]*-/,"-",s);
    print s;
}'
这么看似乎清晰多了吧?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP