独特线路的在线统计

独特线路的在线统计

uniq -c对于计算同一行连续出现的次数非常有用

$ seq 1 1000 | awk '{ if ($1 > 100 && $1 <= 200) { print "hi" } else {print "bye"} }' | uniq -c

100 bye
100 hi
800 bye

然而,为了获得每个唯一行的计数,我必须首先对输入进行排序,这似乎有点低效。

$ seq 1 1000 | awk '{ if ($1 > 100 && $1 <= 200) { print "hi" } else {print "bye"} }' | sort | uniq -c

是否有一种惯用的方法来使用在线算法来统计所有出现的唯一行?

答案1

首先对输入进行排序的效率是最高的。

您可以使用 awk 单行代码来完成此操作:

awk '{++seen[$0]} END {for (line in count) printf "%7d %s\n", count[line], line}'

哪一种更高效(在内存和 CPU 时间方面)取决于数据和实现。sort理论上效率较低,因为它做了额外的工作,但另一方面它只有一项工作并且做得很好,而 awk 是一种通用工具。如果有很多重复项,awk 使用更少的内存并且可能更快一些。另一方面,许多 sort 实现可以处理 RAM 中无法容纳的巨大数据集,而 awk 只会崩溃。

相关内容