免费注册 查看新帖 |

Chinaunix

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

[数值计算] 大数据排序提取指定字段对应的指定函数的值 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2018-11-02 11:24 |只看该作者 |倒序浏览
请问大神,我有一份大文件,表头是:名称-时间戳-日期-流量值
我想根据“每个“名称】获得获得它的流【流量值】降序排序第300个值,最后打印出来:【名称-第300个最大值】,想要获得这个结果怎么写
我用到了sort -k1,1,-k4,4nr这样语句
但是因为【名称】特别多,所以排序非常忙

想大神帮帮忙,看看怎么优化

备注:我截取了部分基础数据在附件

问题.png (6.08 KB, 下载次数: 139)

问题.png

1.rar

163.17 KB, 下载次数: 31

论坛徽章:
0
2 [报告]
发表于 2018-11-02 11:26 |只看该作者
写错别字了:
我用到了sort -k1,1,-k4,4nr这样语句
但是因为【名称】特别多,所以排序非常  【【慢】】
想优化下时间

论坛徽章:
0
3 [报告]
发表于 2018-11-02 12:08 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2018-11-02 12:51 |只看该作者
回复 3# 本友会机友会摄友会

不是很明白,我使用shell脚本对该文件进行的处理,具体应该要怎么操作,帮忙详解下,谢谢~

论坛徽章:
0
5 [报告]
发表于 2018-11-02 13:11 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
6 [报告]
发表于 2018-11-02 13:43 |只看该作者
回复 5# 本友会机友会摄友会

啊 可是我这文件不在数据库里面啊,只是服务器上的一份文件,也能用sql语句?

论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
7 [报告]
发表于 2018-11-02 14:06 |只看该作者
本帖最后由 wh7211 于 2018-11-02 14:13 编辑

回复 1# narcissusLin


<<<awk4.0
  1. awk -F"|" '{a[$1]=--i;b[$1][$4]=$4}END{PROCINFO["sorted_in"]="@val_num_desc";for(i in a){for(j in b[i]){++k;if(k==300){print i,j}};k=0}}' 1
复制代码

论坛徽章:
0
8 [报告]
发表于 2018-11-02 19:54 |只看该作者
回复 7# wh7211

谢谢大神,不过请教一下a[$1]=--i是什么意思

另外如果想一次性输出第300个值和第400个2个值到一份文件怎么办?


最终结果格式是:名称,第300个最大值,第400个值。

麻烦再教一下,万分感谢


论坛徽章:
0
9 [报告]
发表于 2018-11-02 19:56 |只看该作者
回复 7# wh7211

刚刚复制了代码是了下,发现提示错误这样是表示我的shell没有办法用awk 4.0嘛?

awk4.0.png (10.19 KB, 下载次数: 139)

awk4.0.png

论坛徽章:
0
10 [报告]
发表于 2018-11-04 08:46 |只看该作者
Python 版本

我用小數據來演示, 把人名和流量放進 dictionary, 打印第三大流量值
  1. $ cat test.txt
  2. peter|23123123|2018-10-01|107
  3. peter|23123123|2018-10-01|100
  4. peter|23123123|2018-10-01|101
  5. peter|23123123|2018-10-01|99
  6. peter|23123123|2018-10-01|105
  7. peter|23123123|2018-10-01|88
  8. peter|23123123|2018-10-01|121
  9. peter|23123123|2018-10-01|76
  10. mary|23123123|2018-10-01|12
  11. mary|23123123|2018-10-01|15
  12. mary|23123123|2018-10-01|18
  13. mary|23123123|2018-10-01|50
  14. mary|23123123|2018-10-01|22
  15. mary|23123123|2018-10-01|11

  16. $ python test.py
  17. peter
  18. ('Original list: ', ['107', '100', '101', '99', '105', '88', '121', '76'])
  19. ('Sorted list: ', ['121', '107', '105', '101', '100', '99', '88', '76'])
  20. ('The third in the list: ', '105')
  21. mary
  22. ('Original list: ', ['12', '15', '18', '50', '22', '11'])
  23. ('Sorted list: ', ['50', '22', '18', '15', '12', '11'])
  24. ('The third in the list: ', '18')
复制代码


代碼

  1. import re, collections

  2. dict1 = collections.defaultdict(list)

  3. f = open("test.txt", "r")

  4. for line in f:
  5.    p = re.match("(.+)\|.+\|.+\|(.+)", line)
  6.    if p:
  7.       dict1[p.groups()[0]].append(p.groups()[1])

  8. for i in dict1:
  9.    print(i)
  10.    print("Original list: ", dict1[i])
  11.    print("Sorted list: ", sorted(dict1[i], key=lambda x:int(x), reverse=True))
  12.    print("The third in the list: ", sorted(dict1[i], key=lambda x:int(x), reverse=True)[2])
复制代码


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP