免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: wangliang222002
打印 上一主题 下一主题

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

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

  1. sort -k1,1 -k2,2nr -k3,3 -k4,4nr

  2. 需要修改成
  3. sort -k2,2nr -k1,1 -k4,4nr -k3,3

  4. 就是先按照文章数排序,如果文章数相同,按照IP地址排序,对于同一IP内,先按照文章数量数排序,如果文章数量相同,就按照ID排序

  5. 不过,这样有一些问题,如果文章数相同,就会只列表ID小的5个ID

复制代码

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


你这个复杂了

  1. 分解分析:
  2. 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]}}' 数据文件
  3. a[$3]++  记录每个IP的总数
  4. b[$3 " " $2]++  记录每个IP下ID的总数

  5. for(i in b){$0=i;printf "%s\t%d\t%s\t%d\n",$1,a[$1],$2,b[i]}
  6. 列举IP和ID的组合
  7. $0=i 主要目的是分解
  8. printf "%s\t%d\t%s\t%d\n",$1,a[$1],$2,b[i]
  9. 显示信息:
  10. IP 文章总数 ID  ID文章总数

  11. | sort -k2,2nr -k1,1 -k4,4nr  -k3,3
  12. 排序:
  13. 先按照文章总数排序(逆序),如果文章总数相同,按照IP排序,在同一IP下,以ID的文章总数排序(逆序),如果ID文章数相同,就以ID排序

  14. | 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 ""}'
  15. 每个IP只显示前5个ID
复制代码

论坛徽章:
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
13 [报告]
发表于 2010-04-16 12:20 |只看该作者
回复 12# springwind426


    基本上是一样的,只是写法有所不同。

论坛徽章:
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
14 [报告]
发表于 2010-04-16 12:24 |只看该作者
只按IP和id的文章数量来排序就可以了吧。

论坛徽章:
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
15 [报告]
发表于 2010-04-16 12:47 |只看该作者
还是sort -k2,2nr -k1,1 -k4,4nr  -k3,3这个排序比较严格。

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



    统计、排序、过滤 ; 思路清晰,代码简洁。  赞一个。

论坛徽章:
0
17 [报告]
发表于 2010-04-16 13:35 |只看该作者
偶第一份工作就 专门算这个东西嗒
就是 hash +  联合hash
是在不行+临时文件 就ok啦

论坛徽章:
0
18 [报告]
发表于 2010-04-16 14:01 |只看该作者
回复  springwind426


    基本上是一样的,只是写法有所不同。
blackold 发表于 2010-04-16 12:20

  1. for(i in ip) for(j in id)
  2. 这个会遍历很多没有的组合
复制代码

论坛徽章:
0
19 [报告]
发表于 2010-04-16 14:04 |只看该作者
本帖最后由 aluoyeshi 于 2010-04-16 15:11 编辑

cat test.sh
#/bin/sh
for ip_name in `awk '{print $3}' $1 |sort |uniq`
do
    ip_num=`grep "$ip_name" $1 |wc -l`
    echo -n "$ip_name    $ip_num    "
    for user_id in `grep "$ip_name" $1 |awk '{print $2}' |sort |uniq`
    do
        id_num=`grep "$user_id" $1 |wc -l`
        echo -n "$user_id,$id_num:"
    done
    echo
done

用法: sh test.sh file

论坛徽章:
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
20 [报告]
发表于 2010-04-16 14:10 |只看该作者
回复 18# springwind426


    嗯,还是你的简单。学习了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP