Chinaunix

标题: 如何用awk汇总统计 [打印本页]

作者: palmshadow    时间: 2010-09-10 08:55
标题: 如何用awk汇总统计
数据表如下:
1001 王一 1000  
1002 王二 1000
1003 王三 1000
2001 李一 1001
2002 李二 1001
2003 李三 1001
3001 张一 1002
3002 张二 1002
3003 张三 1002
3004 张四 1002
要求根据$3进行汇总统计,统计结果如下:
序号范围 组号 数量
1001-1003 1000 3
2001-2003 1001 3
3001-3004 1002 4
请高手不吝指教,谢谢!
作者: rdcwayx    时间: 2010-09-10 09:18
如果碰上这样的数据,要什么输出?
1001 王一 1000  
1002 王二 1000
1003 王三 1001
作者: palmshadow    时间: 2010-09-10 09:25
目的是要根据组号统计序号的范围(最小序列号-最大序列号)和个数。
作者: rdcwayx    时间: 2010-09-10 09:30
给出要求的输出嘛。 何必让大家猜。

我给的数据,照你的解释是要得到这样的输出?

1001-1002 1000 2
1003-1003 1001 1
作者: lkk2003rty    时间: 2010-09-10 09:34
本帖最后由 lkk2003rty 于 2010-09-10 09:36 编辑
  1. [super@localhost ~]$ awk -f a.awk file
  2. 3001 3003 3004 3007 1002 4
  3. 1001 1003 1000 3
  4. 2001 2003 1001 3
  5. [super@localhost ~]$ cat file
  6. 1001 王一 1000  
  7. 1002 王二 1000
  8. 1003 王三 1000
  9. 2001 李一 1001
  10. 2002 李二 1001
  11. 2003 李三 1001
  12. 3001 张一 1002
  13. 3007 张二 1002
  14. 3003 张三 1002
  15. 3004 张四 1002
  16. [super@localhost ~]$ cat a.awk
  17. {
  18.         a[$3]++;
  19.         b[$3]=b[$3]" "$1;
  20. }
  21. END{
  22.         for(i in a)
  23.         {
  24.                 split(b[i],c," ");
  25.                 flag=1;
  26.                 asort(c);
  27.                 for(j=1;j<length(c);j++)
  28.                 {
  29.                         if(flag==1&&c[j+1]==c[j]+1)
  30.                                 {printf "%s ",c[j];flag=0}
  31.                         if(c[j+1]!=c[j]+1)
  32.                                 {flag=1;printf "%s ",c[j]}
  33.                 }
  34.                 printf "%s ",c[j];printf "%s %d\n",i,a[i]
  35.         }
  36. }
  37. [super@localhost ~]$
复制代码

作者: sunbw001    时间: 2010-09-10 09:39
  1. awk  '{if(b[$3]>0){a[$3]=$1<a[$3]?$1:a[$3];c[$3]=$1>c[$3]?$1:c[$3];b[$3]++}else{a[$3]=$1;c[$3]=$1;b[$3]=1;d[++n]=$3}}END{for(t=1;t<=n;t++){print a[d[t]]"-"c[d[t]]"\t"d[t]"\t"b[d[t]]}}' data
复制代码

作者: blackold    时间: 2010-09-10 09:51
  1. awk '$3!=p{if(NR>1)print s"-"e,p,t;s=e=$1;p=$3;t=1;next}{e=$1;t++}END{print s"-"e,p,t}' urfile
复制代码

作者: palmshadow    时间: 2010-09-10 09:52
谢谢 lkk2003rty和sunbw001解答!
作者: rainbird2    时间: 2010-09-10 10:52
[rainbird@rainbird-laptop ~]$awk '{a[$3]++;if(a[$3] == 1){b[$3"1"]=$1}else{b[$3"2"]=$1}}END{for(i in a)print b[i"1"]"-"b[i"2"],i,a[i]|"sort"}' a
1001-1003 1000 3
2001-2003 1001 3
3001-3004 1002 4
作者: rick.zhao    时间: 2010-09-10 11:07
学习
作者: expert1    时间: 2010-09-10 11:32
xuexizhi
作者: expert1    时间: 2010-09-10 14:39
回复 9# rainbird2


    学习这个。
作者: expert1    时间: 2010-09-10 18:01

这个题我想$3 ++,记录$1第一次出现和最后一次出现的值,然后打印他们3个,试了一下,怎么写不出呢?哎,真是晕啊
作者: iori809    时间: 2010-09-11 08:42
回复 13# expert1


    awk '!a[$3]++{b[$3]=$1}{c[$3]=$1}END{for (i in b){print b"---"c" "a | "sort"}}' linux.197
1001---1003 3
2001---2003 3
3001---3004 4

这个是你想的吧
作者: expert1    时间: 2010-09-11 19:58
回复 14# iori809


    有才啊,呵呵,最近脑子想不出哎。
作者: expert1    时间: 2010-09-12 09:44
本帖最后由 expert1 于 2010-09-12 10:04 编辑

回复 14# iori809


    呵呵,第一次出现和最后一次出现的我都晓得咋整,但是我只用了2个数组,试了好像不成,学习这个。呵呵

好像论坛有bug,贴出的数组a,后面显示不出来,难怪呢。下次最好用
  1. 代码
复制代码

作者: Shell_HAT    时间: 2010-09-12 11:09
回复 16# expert1


code标签也行,把数组下标的i换成j也行:
a[j]




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