阅读标题会引导你思考,我看了这个问题一百次,你做了,但我正在寻找不同的东西:
常见的答案是
sort <input> | uniq -c | sort -nr
但是当输入数千万行时,排序变得不切实际。 Sort是一个O(n log(n))算法。它可以是palatalized,但它仍然需要O(n)的内存量。
我正在寻找一种可以更好地计算这种算法的算法:使用以下假设:日志消息类型的数量远小于日志文件(数千)。我对前50个重复消息感兴趣。
答案 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。