免费注册 查看新帖 |

Chinaunix

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

一个超复杂的shell,想破脑袋了 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-16 10:38 |只看该作者 |倒序浏览
有一个文件,格式为
文章id    用户id    发表文章ip

1           1000      202.207.177.1
2           1000      202.207.177.1
3           1001     202.207.177.2
4          1002     202.207.177.2
5           1006      202.207.177.1
……

要求按照ip发文章总量来排序,即如下
202.207.177.1   3
202.207.177.2   2
这第一步好做,但除了按ip排后,同时还要求把某个ip下发文章做多的用户id统计出来,列出前5个,即需要如下结果
ip                         ip发文章数     用户id,发文章数:用户id:发文章数:...      
202.207.177.1                3     1000,2:1006,1
202.207.177.2                2      1001,1:1002,1
这个就麻烦了,何解?

论坛徽章:
11
金牛座
日期:2015-03-19 16:56:22数据库技术版块每日发帖之星
日期:2016-08-02 06:20:00数据库技术版块每日发帖之星
日期:2016-04-24 06:20:00数据库技术版块每日发帖之星
日期:2016-04-13 06:20:00IT运维版块每日发帖之星
日期:2016-04-13 06:20:00数据库技术版块每日发帖之星
日期:2016-02-03 06:20:00数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00季节之章:春
日期:2015-03-27 15:54:57羊年新春福章
日期:2015-03-27 15:54:37戌狗
日期:2015-03-19 16:56:41数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
2 [报告]
发表于 2010-04-16 10:44 |只看该作者
这个似乎并不麻烦吧

  1. awk '{a[$3]++;b[$3]=b[$3]":"$2","$1}END{for(i in a)print i,a[i],b[i]}' ufile
复制代码
具体的自己办法再扩展..

论坛徽章:
0
3 [报告]
发表于 2010-04-16 10:57 |只看该作者
这个似乎并不麻烦吧具体的自己办法再扩展..
liaosnet 发表于 2010-04-16 10:44


可是这个只统计出了某ip,某用户发的文章。
但还要对每行,用户发的文章数进行统计然后排序,这个麻烦呀

论坛徽章:
0
4 [报告]
发表于 2010-04-16 11:06 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
11
金牛座
日期:2015-03-19 16:56:22数据库技术版块每日发帖之星
日期:2016-08-02 06:20:00数据库技术版块每日发帖之星
日期:2016-04-24 06:20:00数据库技术版块每日发帖之星
日期:2016-04-13 06:20:00IT运维版块每日发帖之星
日期:2016-04-13 06:20:00数据库技术版块每日发帖之星
日期:2016-02-03 06:20:00数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00季节之章:春
日期:2015-03-27 15:54:57羊年新春福章
日期:2015-03-27 15:54:37戌狗
日期:2015-03-19 16:56:41数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
5 [报告]
发表于 2010-04-16 11:06 |只看该作者
本帖最后由 liaosnet 于 2010-04-16 11:10 编辑
可是这个只统计出了某ip,某用户发的文章。
但还要对每行,用户发的文章数进行统计然后排序,这个麻烦 ...
wangliang222002 发表于 2010-04-16 10:57



    你想怎么排? 哦..看明白了..

论坛徽章:
0
6 [报告]
发表于 2010-04-16 11:08 |只看该作者

  1. awk '{a[$3]++;b[$3" "$2]++}END{for(i in b){$0=i;printf "%s\t%d\t%s\t%d\n",$1,a[$1],$2,b[i]}}' 数据文件 | sort -k1,1 -k2,2nr -k3,3 -k4,4nr | awk '++a[$1]<6{if(ip!=$1){printf "\n%s\t%s\t%s,%s",$1,$2,$3,$4;ip=$1}else{printf":%s,%s",$3,$4}}END{print ""}'

  2. 思路:
  3. 1、用awk进行处理,统计出每个IP的文章和每个IP下每个ID的文章
  4. 2、对IP、文章逆序、ID、文章逆序  进行排序
  5. 3、对排序结果进行处理,每个IP的前5个显示
复制代码

论坛徽章:
0
7 [报告]
发表于 2010-04-16 11:15 |只看该作者
回复 6# springwind426


    相当的强悍

论坛徽章:
0
8 [报告]
发表于 2010-04-16 11:20 |只看该作者
回复 6# springwind426


    牛

论坛徽章:
0
9 [报告]
发表于 2010-04-16 11:24 |只看该作者
本帖最后由 ghp268 于 2010-04-16 12:31 编辑
  1. awk '{a[$3" "$2]++}END{for(key in a) print key"\t"a[key]}' myfile | sort -k1,1 -k3nr | awk '{if($1!=last){print last"\t"sum"\t"id;last=$1;sum=$3;id="";id=$2","$3":"}else{sum+=$3;id=id""$2","$3":"} }END{print last"\t"sum"\t"id}'
复制代码
关于那个只需要列出5个ID的,最后再用AWK过滤显示5个就可以了把

..看了前面牛人写的代码发现理解错了,$1不是文章数量,只是代表1篇文章

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
10 [报告]
发表于 2010-04-16 11:29 |只看该作者
本帖最后由 blackold 于 2010-04-16 11:37 编辑
  1. $ awk '{ip[$3]++;id[$2];u[$3"-"$2]++}END{for(i in ip) for(j in id) if(i"-"j in u) print i,ip[i],j,u[i"-"j]}' urfile|sort -nr -k2,2 -k 4,4|awk '$1!=p{if(NR>1)print "";s=0}{if(!s)printf("%s %s %s,%s",$1,$2,$3,$4);else if(s<5)printf(";%s,%s",$3,$4);s++;p=$1}END{print ""}'
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP