Использование sort
команды, вероятно, будет самым быстрым вариантом.
Но вы, вероятно, захотите исправить локаль до C.
sort -u
не сообщает об уникальных строках, но об одном наборе строк, которые сортируются одинаково. В языковом стандарте C две разные строки обязательно не сортируются одинаково, но это не так в большинстве языковых стандартов на основе UTF-8 в системах GNU.
Кроме того, использование языкового стандарта C позволяет избежать дополнительных затрат на анализ UTF-8 и обработку сложных порядков сортировки, что значительно повышает производительность.
Так:
LC_ALL=C sort -u file
Вы также можете повысить производительность, используя более быстрый диск (или диск, отличающийся от того, на котором находятся входные и / или выходные файлы) для временных файлов (используя переменную среды -T
или $TMPDIR
переменную среды), или переключившись на -S
параметр, поддерживаемый некоторыми sort
реализациями) ,
Для некоторого типа ввода или для медленного хранения использование --compress-program
опции GNU sort
(например, с lzop
) может улучшить производительность в дополнение к использованию хранилища.
Теперь просто отметим для тех, кто возражает (справедливо в некоторой степени), что это будет неправильный порядок :
Я согласен, что как человек, я хотел бы видеть Стефана между Стефаном и Стефани , но:
- Компьютер хотел бы Stephane к своего рода после того, как так
é
(по крайней мере , когда выражается в виде U + 00E9) в качестве символа или байтов его UTF-8 кодировкой сортов после (с точки зрения стоимости или элемент кода байта). Это порядок сортировки, который очень прост в реализации, является строгим общим порядком и не вызывает удивления.
Порядок сортировки вашей локали, вероятно, не будет удовлетворительным во многих случаях даже для человека. Например, в моей системе со стандартным языком en_GB.utf8:
Стефан и Стефан (один с U + 00E9, другой с eU + 0301) не сортируют одно и то же:
$ printf '%b\n' 'Ste\u0301phane' 'St\u00e9phane' | sort -u
Stéphane
Stéphane
но ③, ①, ② все сортируются одинаково (очевидно, ошибка в этих определениях локали):
$ printf '%s\n' ③ ① ② | sort -u
③
Вот, это but, но с таким же успехом это могло быть ① или ②
Итак, IMO, скорее всего, вы всегда хотите sort -u
с LC_ALL = C, если вы хотите уникальные строки. И если вы хотите, чтобы этот результирующий список был отсортирован в порядке сортировки пользователя, передайте его sort
снова:
LC_ALL=C sort -u | sort
LC_ALL=C sort | LC_ALL=C uniq -c | sort -k2
/tmp
.