摘要:有没有办法比使用sort | uniq -c | sort -n
更有效地获取文件中的唯一行数和出现次数?
详细信息:在进行日志分析时,我经常通过管道sort | uniq -c | sort -n
来获取哪些日志条目显示最多/最少等的一般趋势。这大部分时间都有效 - 除了当我处理一个非常大的日志文件时,最终会出现大量的重复项(在这种情况下sort | uniq -c
会花费很长时间)。
示例:我现在面临的具体情况是从“未参数化”的mysql bin日志中获取趋势,以找出哪些查询运行最多。对于一个百万条目的文件,我通过grep / sed组合去除参数 - 导致大约150条独特的线条 - 我花了大约3秒的时间和/或sedding,大约15s排序/ uniq'ing。
目前,我已经确定了一个简单的c ++程序来维护< line,count> - 在不到一秒的时间内完成工作 - 但我想知道现有的实用程序是否已经存在。
答案 0 :(得分:5)
我不确定性能差异是什么,但您可以使用简单的sort | uniq -c
脚本替换awk
。既然你有很多重复项并且它有哈希而不是排序,我想它会更快:
awk '{c[$0]++}END{for(l in c){print c[l], l}}' input.txt | sort -n