我想在一个巨大的日志文件中找到最常见的字符串。有没有人能帮我如何做到这一点。一种方法是对每个字符串进行哈希并计算最大值,但这不是高效的。有更好的方法吗?
谢谢和问候,
Mousey.
谢谢和问候,
Mousey.
sort logfile.txt | uniq -c
这假设你的每一行没有独特的内容(例如时间戳),且文件大小足够小,可以用这种方式来处理。
当然,这并没有直接使用C或C++,但考虑到这些工具本身可能是用其中一种编码的,所以应该算是使用了。
"巨大"有多大?什么是"字符串"? Unix命令行工具非常好用:
tr -s ' \011' '\012' < /var/log/messages | sort | uniq -c | sort -rn | head -20
生成
786 --
635 labrador
635 Jun
393 MARK
236 kernel:
163 17
153 usb
136 22
118 21
113 USB
74 device
73 20
73 19
72 18
57 5-1:
51 address
43 speed
36 New
34 0
33 using
在写和调试 C 程序的时间内,你可以运行许多 Shell 脚本。
除非哈希算法很昂贵(我一直认为它们很便宜),否则哈希既可以节省内存(平均哈希长度可能比平均行或单词长度更短,以字节为单位,假设使用8位ASCII),又可以更快地进行字典查找。
不想使用哈希的原因是什么?
如果性能很重要,您可能需要查看trie或Radix tree。
如果你在谈论日志文件中的任意子字符串,那么这个问题是无法在多项式时间内解决的。如果确实是一个巨大的日志文件,我相信你会很困难。
然而,如果你在谈论文件中的任何特定单词,你将不得不引用计数你的单词。这需要某种类型的映射。
如果你在谈论文件中的任何特定行,你将不得不引用计数你的行。这需要某种类型的映射。
无论哪种方式,你都需要使用某种类型的引用计数。