Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 大量重复情况下的有效排序| uniq_Linux_Unix - Fatal编程技术网

Linux 大量重复情况下的有效排序| uniq

Linux 大量重复情况下的有效排序| uniq,linux,unix,Linux,Unix,摘要:有没有比使用排序| uniq-c | sort-n更有效地从文件中获取唯一行和出现次数的方法 详细信息:在进行日志分析时,我经常使用sort | uniq-c | sort-n,以获得哪些日志条目显示得最多/最少的总体趋势等。这在大多数情况下都是有效的,除非我处理的是一个非常大的日志文件,它最终会产生大量的重复项(在这种情况下,sort | uniq-c会花费很长时间) 示例:我现在面临的具体情况是从一个“未参数化”的mysql bin日志中获取一个趋势,以找出哪些查询运行得最多。对于一个

摘要:有没有比使用
排序| uniq-c | sort-n
更有效地从文件中获取唯一行和出现次数的方法

详细信息:在进行日志分析时,我经常使用
sort | uniq-c | sort-n
,以获得哪些日志条目显示得最多/最少的总体趋势等。这在大多数情况下都是有效的,除非我处理的是一个非常大的日志文件,它最终会产生大量的重复项(在这种情况下,
sort | uniq-c
会花费很长时间)

示例:我现在面临的具体情况是从一个“未参数化”的mysql bin日志中获取一个趋势,以找出哪些查询运行得最多。对于一个包含一百万个条目的文件,我通过grep/sed组合来删除参数——导致大约150行独特的行——我花了大约3秒钟的时间进行grep&sedding,大约15秒分拣/统一


目前,我用一个简单的C++程序来解决,它维护了一个“行,计数>的映射——这是在不到一秒钟内完成的工作。但是我想知道现有的实用程序是否已经存在。

我不知道性能上的区别是什么,但是你可以用简单的<代码> AWK</代码>脚本替换该<代码>排序UNIQ-C/<代码>。因为您有许多重复项,并且它是散列而不是排序的,所以我认为它更快:

 awk '{c[$0]++}END{for(l in c){print c[l], l}}' input.txt | sort -n

等待直到C++程序内存不足:- Dwhy将使用一个映射来存储发生次数,使用比排序每一个事件更多的内存(即排序类的UNIQ-C排序-N序列中的第一个排序)?将使用临时文件来保存太大而无法立即放入内存中的数据。@ephemient:谢谢,这为我指明了检查coreutils版本的方向。这是cpp实现,仅供参考。谢谢,这对有大量重复的文件非常有效。然而,事实证明,我使用的两个系统sting on(Mac OSX Lion和RHEL 4)有一个非常旧的sort版本(5.x),将性能与coreutils 8.x(在ubuntu 12.04上测试)进行了比较对那些感兴趣的人来说,coreutils 5.x和8.x之间的比较:如果你有一个大的文件目录,你想用这个脚本对uniq进行排序,你可以这样运行:
awk'{c[$0]+}END{for(l in c){print c[l],l}“在Apache日志中查找唯一的用户代理时有了巨大的改进。