免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3648 | 回复: 12
打印 上一主题 下一主题

[文本处理] 按区间分组汇总,大神们帮我看看怎么写? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-05-13 09:05 |只看该作者 |倒序浏览
文件:test.txt
A 5
A 12
B 1
B 2
B 22
B 23
C 12
C 24
C 35

按第一列分组再将第二列的数值按以下3个区间分组汇总个数:0-10 ;11-20;>20  结果类似下面这种格式

A 0-10  1
A 11-20 1
A >20   0
B 0-10  2
B 11-20 0
B >20   2
C 0-10  0
C 11-20 1
C >20   2

捣鼓半天搞不出来,大家帮我看看呐,感谢!

论坛徽章:
2
操作系统版块每日发帖之星
日期:2016-05-16 06:20:0015-16赛季CBA联赛之八一
日期:2016-05-18 15:38:22
2 [报告]
发表于 2016-05-13 10:02 |只看该作者
  1. awk '!b[$1]++{a[$1" 0-10"]=0;a[$1" 11-20"]=0;a[$1" >20"]=0}{if($2<11){a[$1" 0-10"]++}else if($2<21){a[$1" 11-20"]++}else{a[$1" >20"]++}}END{for(i in a){print i,a[i]}}' test.txt |sort
复制代码

论坛徽章:
0
3 [报告]
发表于 2016-05-13 10:10 |只看该作者
感谢大神!!回复 2# 287380917


   

论坛徽章:
2
操作系统版块每日发帖之星
日期:2016-05-16 06:20:0015-16赛季CBA联赛之八一
日期:2016-05-18 15:38:22
4 [报告]
发表于 2016-05-13 10:17 |只看该作者
回复 3# zhuzixiangshui
我也是刚开始学,只会暴力匹配,没得技巧可言,哈哈。


   

论坛徽章:
6
羊年新春福章
日期:2015-03-03 17:16:28双子座
日期:2015-03-03 17:16:56巳蛇
日期:2015-03-03 17:17:2415-16赛季CBA联赛之福建
日期:2016-03-11 09:05:00黑曼巴
日期:2016-07-07 16:58:1215-16赛季CBA联赛之吉林
日期:2016-11-14 09:23:07
5 [报告]
发表于 2016-05-13 10:40 |只看该作者
#!/bin/bash

awk '{a[$1]=a[$1]" "$2}END{for(i in a)print i,a[i]}' file > test.txt

while read line
do
  test1=0
  test2=0
  test3=0
  text=`echo $line|awk '{print $1}'`
  num=`echo $line|awk '{$1="";print}'`
  for i in $num
  do
        if [ $i -le 10 ]
        then
          let test1=$test1+1
        elif [ $i -gt 10 -a $i -le 20 ]
        then
          let test2=$test2+1
        elif [ $i -gt 20 ]
        then
          let test3=$test3+1
        fi
  done
  echo $text '0-10' $test1
  echo $text '11-20' $test2
  echo $text '>20' $test3
done < test.txt

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
6 [报告]
发表于 2016-05-13 10:54 |只看该作者
回复 1# zhuzixiangshui

$ awk '{a[$1,int(--$2/10)+1]++;if(!b[$1]++)b[++c]=$1}END{split("0-10,11-20,>20",d,",");for(n=1;n<=c;++n)for(m=1;m<=3;++m)print b[n],d[m],+a[b[n],m]}' FILE
A 0-10 1
A 11-20 1
A >20 0
B 0-10 2
B 11-20 0
B >20 2
C 0-10 0
C 11-20 1
C >20 1

   

论坛徽章:
54
2015亚冠之德黑兰石油
日期:2015-07-07 13:00:1615-16赛季CBA联赛之深圳
日期:2016-03-31 09:03:5415-16赛季CBA联赛之辽宁
日期:2016-05-09 20:38:15程序设计版块每日发帖之星
日期:2016-05-12 06:20:0015-16赛季CBA联赛之四川
日期:2016-05-13 15:19:4715-16赛季CBA联赛之福建
日期:2016-05-15 20:24:34每日论坛发贴之星
日期:2016-05-16 06:20:0015-16赛季CBA联赛之吉林
日期:2016-05-26 11:49:4715-16赛季CBA联赛之广东
日期:2016-05-26 13:49:18极客徽章
日期:2016-12-07 14:05:2315-16赛季CBA联赛之广夏
日期:2016-12-20 17:33:532017金鸡报晓
日期:2017-01-10 15:19:56
7 [报告]
发表于 2016-05-13 11:02 |只看该作者
本帖最后由 haooooaaa 于 2016-05-13 12:42 编辑
  1. awk 'BEGIN{split("0-10 11-20 >20",t)}{f=int(--$2/10)+1;f=f>2?3:f;a[$1,t[f]]++;b[$1]}END{for(i in b)for(j in t)print i,t[j],+a[i,t[j]]}'
复制代码
  1. awk '{f=int(--$2/10);f=f>1?">20":f*10+f"-"(f+1)*10;a[$1,f]++;b[f];c[$1]}END{for(i in c)for(j in b)print i,j,+a[i,j]}'
复制代码

论坛徽章:
0
8 [报告]
发表于 2016-05-13 11:05 |只看该作者
感谢!!回复 5# jcdiy0601


   

论坛徽章:
0
9 [报告]
发表于 2016-05-13 11:15 |只看该作者
感谢!回复 7# haooooaaa


   

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
10 [报告]
发表于 2016-05-13 11:24 |只看该作者
回复 7# haooooaaa

try the data with 10,20,...
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP