免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
12下一页
最近访问板块 发新帖
查看: 1138 | 回复: 18

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

论坛徽章:
0
发表于 2018-11-02 11:24 |显示全部楼层
请问大神,我有一份大文件,表头是:名称-时间戳-日期-流量值
我想根据“每个“名称】获得获得它的流【流量值】降序排序第300个值,最后打印出来:【名称-第300个最大值】,想要获得这个结果怎么写
我用到了sort -k1,1,-k4,4nr这样语句
但是因为【名称】特别多,所以排序非常忙

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

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

问题.png

1.rar

163.17 KB, 下载次数: 13

论坛徽章:
0
发表于 2018-11-02 11:26 |显示全部楼层
写错别字了:
我用到了sort -k1,1,-k4,4nr这样语句
但是因为【名称】特别多,所以排序非常  【【慢】】
想优化下时间

论坛徽章:
0
发表于 2018-11-02 12:08 |显示全部楼层
这是数据库问题,关系型数据库,1,4列联合索引。

论坛徽章:
0
发表于 2018-11-02 12:51 |显示全部楼层
回复 3# 本友会机友会摄友会

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

论坛徽章:
0
发表于 2018-11-02 13:11 |显示全部楼层
shell的话,可以用shell执行mysql查询语句啊。
当然可以用任何程序语言,任何数据库。

论坛徽章:
0
发表于 2018-11-02 13:43 |显示全部楼层
回复 5# 本友会机友会摄友会

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

论坛徽章:
19
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:33黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:0915-16赛季CBA联赛之八一
日期:2018-07-03 16:56:4615-16赛季CBA联赛之深圳
日期:2018-06-15 14:59:3715-16赛季CBA联赛之青岛
日期:2018-06-08 13:45:2815-16赛季CBA联赛之同曦
日期:2018-06-04 19:42:2015-16赛季CBA联赛之山东
日期:2018-05-30 12:44:59CU十四周年纪念徽章
日期:2018-05-15 11:36:3815-16赛季CBA联赛之广东
日期:2018-05-14 09:52:42
发表于 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
发表于 2018-11-02 19:54 |显示全部楼层
回复 7# wh7211

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

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


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

麻烦再教一下,万分感谢


论坛徽章:
0
发表于 2018-11-02 19:56 |显示全部楼层
回复 7# wh7211

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

论坛徽章:
0
发表于 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])
复制代码


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

本版积分规则 发表回复

【CUer福利】柯尼卡美能达2018数字化整合解决方案巡展
智领共创链动价值-2018数字化整合解决方案巡展

2018年11月,柯尼卡美能达携手主流IT网络媒体IT168及旗下ITPUB、ChinaUnix等论坛,特此邀请企业IT管理、运维人员/办公设备采购负责人员共同参与,分享柯尼卡美能达“智领共创链动价值”-2018数字化整合解决方案巡展!现场体验MOBOTIX智能视频监控解决方案!

活动入口>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP