Chinaunix

标题: 大神们帮我分析下:(awk) [打印本页]

作者: tank064    时间: 2012-11-02 11:32
标题: 大神们帮我分析下:(awk)
  1. [benny@qycn ~]$ cat a
  2. bc 1
  3. abc 2
  4. abc 3
  5. cde 1
  6. cde 2
  7. fff 1
  8. fff 2
  9. fff 3
  10. fff 5
  11. fff 7
  12. fff 9
  13. fff 10
  14. fff 11
  15. fff 12
  16. fff 13
  17. [benny@qycn ~]$ awk '{a[$1]=a[$1]" "$2}END{for(i in a){printf i":";c=split(a[i],b);for(i=2;i<=c;i++){if(b[i]==(b[i-1]+1)){if(i==c){printf d"-"b[i]}else{if(!d)d=b[i-1]}}else{if(d){printf d"-"b[i-1]",";d=""}else{printf b[i-1]","}}};printf "\n"}}' a
  18. cde:-2
  19. bc:
  20. fff:1-3,5,7,9-13
  21. abc:9-3
复制代码

看了半天没懂。。

作者: waker    时间: 2012-11-02 12:11
那就再看半天试试呗
作者: zooyo    时间: 2012-11-02 12:52
提示: 作者被禁止或删除 内容自动屏蔽
作者: jason680    时间: 2012-11-02 13:36
本帖最后由 jason680 于 2012-11-02 13:39 编辑

回复 1# tank064

n for number
p for next time output
id for remember last $1

$ echo 'bc 1
abc 2
abc 3
cde 1
cde 2
fff 1
fff 2
fff 3
fff 5
fff 7
fff 9
fff 10
fff 11
fff 12
fff 13' | awk '{if($1!=id){if(id!=""){print p};printf $1":"$2;p="";n=$2}else{if(n+1==$2)p="-"$2;else{printf p","$2;p=""}n=$2}id=$1}END{print p}'
bc:1
abc:2-3
cde:1-2
fff:1-3,5,7,9-13

   
作者: yestreenstars    时间: 2012-11-02 14:42
  1. awk '{if(a[$1]){if(gensub(/.*[-,]([0-9]+)$/,"\\1",1,a[$1])+1==$2)a[$1]=a[$1]"-"$2;else a[$1]=a[$1]","$2}else a[$1]=$2}END{for(i in a){gsub(/-[^,]*-/,"-",a[i]);print i":"a[i]}}' urfile
复制代码
  1. bc:1
  2. abc:2-3
  3. cde:1-2
  4. fff:1-3,5,7,9-13
复制代码





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2