免费注册 查看新帖 |

Chinaunix

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

[文本处理] 练习题(排序合并) [复制链接]

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
21 [报告]
发表于 2014-01-16 23:14 |只看该作者
回复 19# yinyuemi

看起来好复杂,学习了match截取字符串的方法和4.0多维数组的处理~{:3_203:}
   

论坛徽章:
29
程序设计版块每日发帖之星
日期:2016-02-29 06:20:0015-16赛季CBA联赛之天津
日期:2016-08-10 10:33:1115-16赛季CBA联赛之深圳
日期:2016-08-17 15:07:2015-16赛季CBA联赛之佛山
日期:2016-11-07 11:33:5015-16赛季CBA联赛之广夏
日期:2016-11-15 09:13:31CU十四周年纪念徽章
日期:2016-11-24 14:12:25极客徽章
日期:2016-12-07 14:03:4015-16赛季CBA联赛之深圳
日期:2016-12-07 17:15:2715-16赛季CBA联赛之北京
日期:2016-12-22 09:30:0115-16赛季CBA联赛之深圳
日期:2016-12-22 10:49:2115-16赛季CBA联赛之山西
日期:2017-02-10 09:05:3215-16赛季CBA联赛之同曦
日期:2017-02-27 14:19:08
22 [报告]
发表于 2014-01-16 23:39 |只看该作者
  1. [redhat@localhost 0108]$ cat lj.awk
  2. #!/bin/awk

  3. {
  4.         if(!a[$1,$2]++)
  5.                 b[$1]=b[$1]?b[$1]" "$2:$2
  6.         c[$1,$2]=c[$1,$2]?c[$1,$2]" "$3:$3
  7. }
  8. END{
  9.         for(i in b){
  10.                 l=split(b[i],sb)
  11.                 printf i": ";
  12.                 for(j=1;j<=l;++j){
  13.                         li=split(c[i,sb[j]],sc)
  14.                         min=sc[1]
  15.                         for(k=1;k<li;++k){
  16.                                 if(sc[k]+1!=sc[k+1]){
  17.                                         printf sc[k]==min?sb[j]min",":sb[j]min"-"sc[k]","
  18.                                         min=sc[k+1]
  19.                                 }
  20.                         }
  21.                         printf sc[k]==min?sb[j]min:sb[j]min"-"sc[k]
  22.                         if(j<l) printf ","
  23.                 }
  24.                 print ""
  25.         }

  26. }
  27. [redhat@localhost 0108]$ awk '{$2=gensub(/([^0-9]+)([0-9]+)/,"\\1\t\\2",1,$2)}1' lianjie_jq | sort -k1,2 -k3n | awk -f lj.awk
  28. apple: cat12,cat106-109,cat123,cat125
  29. pear: dog11,dog101,dog103-105,mouse106-109,mouse123,mouse125
复制代码

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
23 [报告]
发表于 2014-01-17 00:01 |只看该作者
回复 19# yinyuemi

学以致用,我也来个4.0版的awk:
  1. $ awk '{match($2,/([^0-9]+)(.*)/,a);b[$1][a[1]][a[2]]=a[2]}END{for(i in b){printf i":\t";for(j=0;j++<asorti(b[i],c);){for(k=0;k++<asort(b[i][c[j]],d);)t=t?d[k]-d[k-1]==1?t"-"c[j]d[k]:t","c[j]d[k]:c[j]d[k];s=s?s","t:t;t=""}gsub(/-[^,]+-[^0-9]+/,"-",s);print s;s=""}}' i
  2. apple:  cat12,cat106-109,cat123,cat125
  3. pear:   dog11,dog101,dog103-105,mouse106-109,mouse123,mouse125
复制代码
多行脚本有助于理解:
  1. #!/bin/awk -f
  2. {
  3.         match($2,/([^0-9]+)(.*)/,a)
  4.         b[$1][a[1]][a[2]]=a[2]
  5. }
  6. END{
  7.         for(i in b){
  8.                 printf i":\t"
  9.                 for(j=0;j++<asorti(b[i],c);){
  10.                         for(k=0;k++<asort(b[i][c[j]],d);){
  11.                                 t=t?d[k]-d[k-1]==1?t"-"c[j]d[k]:t","c[j]d[k]:c[j]d[k]
  12.                         }
  13.                         s=s?s","t:t
  14.                         t=""
  15.                 }
  16.                 gsub(/-[^,]+-[^0-9]+/,"-",s)
  17.                 print s
  18.                 s=""
  19.         }
  20. }
复制代码

论坛徽章:
0
24 [报告]
发表于 2014-01-19 19:45 |只看该作者
学习学习学习学习学习学习学习学习

论坛徽章:
14
15-16赛季CBA联赛之辽宁
日期:2019-06-16 15:47:3515-16赛季CBA联赛之广夏
日期:2016-08-13 21:24:352015亚冠之武里南联
日期:2015-07-07 17:37:372015亚冠之萨济拖拉机
日期:2015-07-06 17:07:482015亚冠之全北现代
日期:2015-06-04 13:54:272015亚冠之城南
日期:2015-05-21 15:43:212015年亚洲杯之伊朗
日期:2015-04-25 18:20:362015年亚洲杯之伊朗
日期:2015-04-20 16:06:052015年亚洲杯之科威特
日期:2015-03-07 12:51:26丑牛
日期:2014-12-30 10:26:38申猴
日期:2014-09-28 22:40:18金牛座
日期:2014-09-13 21:12:22
25 [报告]
发表于 2014-01-19 22:06 |只看该作者
必须顶顶~~~

论坛徽章:
0
26 [报告]
发表于 2014-01-19 22:22 |只看该作者
回复看答案~~!

论坛徽章:
0
27 [报告]
发表于 2014-01-20 12:05 |只看该作者
新手学习路过!!!!!!!!

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
28 [报告]
发表于 2014-01-20 13:53 |只看该作者
新手学习,

我回复下能看到答案么?  {:2_172:}

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-06-23 06:20:00
29 [报告]
发表于 2014-01-20 16:29 |只看该作者
顶顶顶顶顶顶顶顶顶顶顶顶顶

论坛徽章:
0
30 [报告]
发表于 2014-01-21 12:05 |只看该作者
昨天问题看了有点疑惑想问LZ
关于第二列的排序是优先字母排序还是优先数字排序的部分?
,今天上午按照字母优先做了下。
  1. awk 'BEGIN{i=0;j=0};
  2. {a[$1,$2]=$2;b[$1]++};
  3. END{for(c in a)
  4. {
  5. s[c]=substr(a[c],1,match(a[c],/[0-9]*$/)-1);
  6. n[c]=substr(a[c],RSTART,RLENGTH);
  7. }
  8. for(d in b)
  9. {
  10. printf d": ";
  11. for(i=0;i<=b[d];i++)
  12. {
  13. first=0;
  14. for(c in s)
  15. {
  16. if(index(c,d)!=1){continue}
  17. if(m[c]==1){continue}
  18. if(first==0)
  19. {
  20. nows=s[c];
  21. nown=n[c];
  22. nowc=c;
  23. first=1;
  24. continue;
  25. }
  26. if(s[c]<=nows&&int(n[c])<=int(nown))
  27. {
  28. nows=s[c];
  29. nown=n[c];
  30. nowc=c;
  31. }
  32. }
  33. m[nowc]=1;
  34. if(i==0){lasts=nows;lastn=nown;count=0;continue}
  35. if(nows==lasts&&int(nown)==int(lastn+count+1)){count++;continue}
  36. if(count==0)printf lasts lastn;
  37. else printf lasts lastn"-"lastn+count;
  38. lasts=nows;
  39. lastn=nown;
  40. count=0;
  41. if(i!=b[d])printf ",";
  42. }
  43. printf "\n";
  44. }
  45. }'
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP