- 论坛徽章:
- 32
|
回复 19# yinyuemi
学以致用,我也来个4.0版的awk:- $ 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
- apple: cat12,cat106-109,cat123,cat125
- pear: dog11,dog101,dog103-105,mouse106-109,mouse123,mouse125
复制代码 多行脚本有助于理解:- #!/bin/awk -f
- {
- 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=""
- }
- }
复制代码 |
|