Я склоняюсь к 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) в худшем случае и может доминировать во время выполнения, если число уникальных строк велико.