排序合并(二)

1160阅读 0评论2014-01-16 yestreenstars
分类:LINUX

处理前:
pear    mouse107
pear    mouse123
pear    mouse109
pear    mouse125
apple   cat123
pear    dog105
pear    dog101
apple   cat12
pear    dog104
apple   cat108
pear    dog11
apple   cat125
apple   cat106
pear    mouse108
pear    mouse106
apple   cat107
pear    dog103
apple   cat109

处理后:
apple: cat12,cat106-109,cat123,cat125
pear: dog11,dog101,dog103-105
pear: mouse106-109,mouse123,mouse125


点击(此处)折叠或打开

  1. #!/bin/awk -f
  2. {
  3.         a=gensub(/([^0-9]+).*/,"\\1",1,$2);
  4.         b=gensub(/[^0-9]+(.*)/,"\\1",1,$2);
  5.         c=sprintf("%s%10d",a,b);
  6.         d[$1"\t"c]=b;
  7. }
  8. END{
  9.         for(i=0;i++<asorti(d,e);){
  10.                 split(e[i],f);
  11.                 if(!g)printf "%s: ",f[1];
  12.                 if(g&&g!=f[1]f[2]){
  13.                         gsub(/-[^,]+-[^0-9]+/,"-",h);
  14.                         sub(/.$/,"",h);
  15.                         printf "%s\n%s: ",h,f[1];
  16.                         h="";
  17.                 }
  18.                 h=d[e[i+1]]-d[e[i]]==1?h""f[2]d[e[i]]"-":h""f[2]d[e[i]]",";
  19.                 g=f[1]f[2];
  20.          }
  21.         gsub(/-[^,]+-[^0-9]+/,"-",h);
  22.         sub(/,[^,]+,$/,"",h);
  23.         print h;
  24. }


上一篇:排序合并(一)
下一篇:排序合并(三)