Використання 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 за замовчуванням:
Stéphane та Stéphane (один з U + 00E9, другий з eU + 0301) не сортують те саме:
$ printf '%b\n' 'Ste\u0301phane' 'St\u00e9phane' | sort -u
Stéphane
Stéphane
але ③, ①, sort всі подібні (очевидно, помилка в цих визначеннях локалі):
$ printf '%s\n' ③ ① ② | sort -u
③
Ось це ③, але це так само могло бути ① чи ②
Тож 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
.