免费注册 查看新帖 |

Chinaunix

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

[文本处理] 次数统计并按分布打印 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-03-20 10:26 |只看该作者 |倒序浏览
请教个次数统计并按分布打印的问题:
文件1.txt中有类似这样的数据:
日期           数
2014037        3251
20111011  3251
20110811        3251
2004039        8027
2004040        5665
2004041        8141
2004042        7801
2014043        7801
2004044        3822
2005001        0546
2005002        8027
2005003        4311
2005004        6747
2015005        3251
2006006        4209
2005007        4350
2005008        2810
2015009        2998
需要如下操作:统计第2列中每个数字出现的次数,并打印对应的次数和分布。
最终期望的形式是这样的:
比如3251这个数字出现在2014037,20111011,20110811,2015005这几个日期,
那么期望统计后打印出来的形式为:
×××××××××××××××××××××××××××××××××××××××××××××××××
数字               出现次数                     2011             2012           2013          2014           2015
3251               4                                2                                                     1                   1
关于次数统计的倒是比较好写:awk '{a[$1]++}END{for(i in a){print i,a[i] | "sort -r -k 2"}}' file,但是后面那个分布统计怎么写,希望赐教。


求职 : 机器学习
论坛徽章:
79
2015年亚洲杯纪念徽章
日期:2015-05-06 19:18:572015七夕节徽章
日期:2015-08-21 11:06:172015亚冠之阿尔纳斯尔
日期:2015-09-07 09:30:232015亚冠之萨济拖拉机
日期:2015-10-21 08:26:3915-16赛季CBA联赛之浙江
日期:2015-12-30 09:59:1815-16赛季CBA联赛之浙江
日期:2016-01-10 12:35:21技术图书徽章
日期:2016-01-15 11:07:2015-16赛季CBA联赛之新疆
日期:2016-02-24 13:46:0215-16赛季CBA联赛之吉林
日期:2016-06-26 01:07:172015-2016NBA季后赛纪念章
日期:2016-06-28 17:44:45黑曼巴
日期:2016-06-28 17:44:4515-16赛季CBA联赛之浙江
日期:2017-07-18 13:41:54
2 [报告]
发表于 2015-03-20 11:04 |只看该作者
本帖最后由 zsszss0000 于 2015-03-20 11:09 编辑
  1. awk '{a[$2]++;year=substr($1,1,4);b[$2,year]++;c[year]=1;}END{for( ia in a){printf ia"\t"a[ia]"\t";for (ic in c){if((ia,ic) in b){printf b[ia,ic]"\t"}else{printf"0\t"} }printf "\n"}}' file
复制代码
修正了一下,加入打印信息的第一行抬头。
awk '{a[$2]++;year=substr($1,1,4);b[$2,year]++;c[year]=1;}END{printf "数字""\t""次数""\t";for(ic in c)printf ic"\t";printf"\n";for( ia in a){printf ia"\t"a[ia]"\t";for (ic in c){if((ia,ic) in b){printf b[ia,ic]"\t"}else{printf"0\t"} }printf "\n"}}' file
  1. 数字    次数    2011    2004    2005    2014    2006    2015
  2. 7801    2       0       1       0       1       0       0
  3. 8027    2       0       1       1       0       0       0
  4. 4311    1       0       0       1       0       0       0
  5. 5665    1       0       1       0       0       0       0
  6. 2810    1       0       0       1       0       0       0
  7. 6747    1       0       0       1       0       0       0
  8. 3251    4       2       0       0       1       0       1
  9. 4350    1       0       0       1       0       0       0
  10. 8141    1       0       1       0       0       0       0
  11. 2998    1       0       0       0       0       0       1
  12. 4209    1       0       0       0       0       1       0
  13. 0546    1       0       0       1       0       0       0
  14. 3822    1       0       1       0       0       0       0
复制代码

论坛徽章:
0
3 [报告]
发表于 2015-03-20 11:26 |只看该作者
非常感谢,我去试试。
早上鼓捣了好一会没弄出来

论坛徽章:
0
4 [报告]
发表于 2015-03-20 11:33 |只看该作者
试了下可以,但是有个问题,怎么让年按照从旧到新的顺序排列,同时那数字列按照从大到小的顺序。

论坛徽章:
28
2015年迎新春徽章
日期:2015-03-04 10:16:53午马
日期:2015-03-20 17:11:07亥猪
日期:2015-03-20 17:11:23戌狗
日期:2015-03-20 17:11:33酉鸡
日期:2015-03-20 17:11:47申猴
日期:2015-03-20 17:11:58未羊
日期:2015-03-20 17:12:10子鼠
日期:2015-03-20 17:12:23丑牛
日期:2015-03-20 17:12:40卯兔
日期:2015-03-20 17:12:51辰龙
日期:2015-03-20 17:13:00巳蛇
日期:2015-03-20 17:13:12
5 [报告]
发表于 2015-03-20 11:58 |只看该作者
  1. awk 'NR>1{date=substr($1,1,4);a[date]=date;b[date,$2]++;c[$2]++}END{for(j=0;j++<asort(a);){printf j==1?"num\ttimes\t"a[j]"\t":j==length(a)?a[j]"\n":a[j]"\t"};for(k in b){split(k,d,SUBSEP);printf d[2]"\t"c[d[2]]"\t";for(l=0;l++<length(a);){printf l==length(a)?b[a[l],d[2]]"\n":b[a[l],d[2]]"\t"}}}'  inputfile
复制代码
试试这个.

论坛徽章:
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 [报告]
发表于 2015-03-20 12:16 |只看该作者
回复 4# coldface

$ awk 'NR>1{y=substr($1,1,4);ay[y]=1;a[$2]++;c[$2,y]++}END{s="数字\t次数";ty=asorti(ay);for(n=1;n<=ty;n++)s=s"\t"ay[n];print s;t=asorti(a,b);for(n=1;n<=t;n++){N=b[n];s=N"\t"a[N];for(ny=1;ny<=ty;ny++)s=s"\t"c[N,ay[ny]];print s}}' FILE
  1. 数字        次数        2004        2005        2006        2011        2014        2015
  2. 0546        1                1                                
  3. 2810        1                1                                
  4. 2998        1                                                1
  5. 3251        4                                2        1        1
  6. 3822        1        1                                       
  7. 4209        1                        1                        
  8. 4311        1                1                                
  9. 4350        1                1                                
  10. 5665        1        1                                       
  11. 6747        1                1                                
  12. 7801        2        1                                1        
  13. 8027        2        1        1                                
  14. 8141        1        1                                       
复制代码

   

论坛徽章:
0
7 [报告]
发表于 2015-03-20 12:21 |只看该作者
回复 6# jason680
这个可以,非常感谢。

谢谢大家!

   

论坛徽章:
0
8 [报告]
发表于 2015-03-20 12:32 |只看该作者
回复 6# jason680
还有点小问题,看着有点别扭,怎么把没有的用0填充啊

   

求职 : 机器学习
论坛徽章:
79
2015年亚洲杯纪念徽章
日期:2015-05-06 19:18:572015七夕节徽章
日期:2015-08-21 11:06:172015亚冠之阿尔纳斯尔
日期:2015-09-07 09:30:232015亚冠之萨济拖拉机
日期:2015-10-21 08:26:3915-16赛季CBA联赛之浙江
日期:2015-12-30 09:59:1815-16赛季CBA联赛之浙江
日期:2016-01-10 12:35:21技术图书徽章
日期:2016-01-15 11:07:2015-16赛季CBA联赛之新疆
日期:2016-02-24 13:46:0215-16赛季CBA联赛之吉林
日期:2016-06-26 01:07:172015-2016NBA季后赛纪念章
日期:2016-06-28 17:44:45黑曼巴
日期:2016-06-28 17:44:4515-16赛季CBA联赛之浙江
日期:2017-07-18 13:41:54
9 [报告]
发表于 2015-03-20 12:35 |只看该作者
本帖最后由 zsszss0000 于 2015-03-20 12:41 编辑
  1. awk '{a[$2]++;year=substr($1,1,4);b[$2,year]++;c[year]=1;}END{len=asorti(c,cc);printf "数字""\t""次数""\t";for(i=1;i<=len;i++)printf cc[i]"\t";printf"\n";for( ia in a){printf ia"\t"a[ia]"\t";for (ic in cc){if((ia,cc[ic]) in b){printf b[ia,cc[ic]]"\t"}else{printf"0\t"} }printf "\n"}}' file | sort -n
复制代码
不对这个错了,还得调试一下,下面这个试一试
  1. awk '{a[$2]++;year=substr($1,1,4);b[$2,year]++;c[year]=1;}END{len=asorti(c,cc);printf "数字""\t""次数""\t";for(i=1;i<=len;i++)printf cc[i]"\t";printf"\n";for( ia in a){printf ia"\t"a[ia]"\t";for (ic=1;ic<=len;ic++){if((ia,cc[ic]) in b){printf b[ia,cc[ic]]"\t"}else{printf"0\t"} }printf "\n"}}' file | sort -n
复制代码
  1. 数字    次数    2004    2005    2006    2011    2014    2015
  2. 0546    1       0       1       0       0       0       0
  3. 2810    1       0       1       0       0       0       0
  4. 2998    1       0       0       0       0       0       1
  5. 3251    4       0       0       0       2       1       1
  6. 3822    1       1       0       0       0       0       0
  7. 4209    1       0       0       1       0       0       0
  8. 4311    1       0       1       0       0       0       0
  9. 4350    1       0       1       0       0       0       0
  10. 5665    1       1       0       0       0       0       0
  11. 6747    1       0       1       0       0       0       0
  12. 7801    2       1       0       0       0       1       0
  13. 8027    2       1       1       0       0       0       0
  14. 8141    1       1       0       0       0       0       0
复制代码
回复 4# coldface


   

论坛徽章:
0
10 [报告]
发表于 2015-03-20 12:39 |只看该作者
回复 9# zsszss0000


感谢。
看来对AWK的使用是炉火纯青!


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP