计算日志中重复的顶部行

时间:2014-08-11 11:16:13

标签: linux algorithm bash counting

阅读标题会引导你思考,我看了这个问题一百次,你做了,但我正在寻找不同的东西:

常见的答案是

sort <input> | uniq -c | sort -nr

但是当输入数千万行时,排序变得不切实际。 Sort是一个O(n log(n))算法。它可以是palatalized,但它仍然需要O(n)的内存量。

我正在寻找一种可以更好地计算这种算法的算法:使用以下假设:日志消息类型的数量远小于日志文件(数千)。我对前50个重复消息感兴趣。

1 个答案:

答案 0 :(得分:1)

您可以使用awk实现简单类型的存储分类:

awk 'a[$0]++; END {for (line in a) { print a[line], line; }}' |  sort -k1,1nr | head -50

awk命令计算每个唯一行的出现次数,并在O(n)时间内输出每行的计数。 sort然后简单地按反向数字顺序对输出进行排序,head输出最大的50。