我有一个大约2000万行的文本文件.每行长度为25个字符.我估计大概有大约200k-300k的独特线路.我想知道的是究竟有多少条独特的线条,以及每条线条的出现次数(我希望结果是幂律式的).
我能做到这一点:
sort bigfile|uniq -c |sort -nr > uniqcounts wc -l uniqcounts
但这是非常低效的记忆和时间.
这个问题的最佳命令行解决方案是什么?
当我遇到像这样的文本处理问题时,我倾向于倾向于Perl,特别是因为Perl安装在大多数Unix系统上.(你可以用awk做同样的事情,这可能会更有用.)
像这样的东西应该做的伎俩:
#!/usr/bin/perl while(<>) { chomp; $lines{$_}++; } print "Total unique lines: ", scalar(keys %lines), "\n"; foreach my $line (sort {$lines{$b} <=> $lines{$a}} keys %lines) { printf "%6d %s\n", $lines{$line}, $line; }
(你可以做一个单行,但是分解使它更容易阅读.)
这需要O(n)内存用于散列键,其中n是唯一行的数量.运行时效率取决于散列查找,但介于O(n)(如果没有散列冲突)和O(n*log n)(对于平衡树)之间.在最坏的情况下,最终的可选排序可能需要O(n ^ 2),并且如果唯一行的数量很高,则可能在运行时占主导地位.