Везде, где я вижу, кто-то должен получить отсортированный, уникальный список, к которому они всегда обращаются sort | uniq
. Я никогда не видел примеров, где кто-то использует sort -u
вместо этого. Почему нет? В чем разница, и почему для сортировки лучше использовать uniq, чем уникальный флаг?
120
Ответы:
sort | uniq
существовал ранееsort -u
и совместим с более широким спектром систем, хотя почти все современные системы поддерживают-u
его - это POSIX. В основном это возврат к тем временам, когдаsort -u
их не было (и люди не склонны менять свои методы, если способ, который они знают, продолжает работать, просто посмотритеifconfig
противip
принятия).Вероятно, они были объединены, поскольку удаление дубликатов в файле требует сортировки (по крайней мере, в стандартном случае) и является чрезвычайно распространенным вариантом использования сортировки. Это также быстрее внутри благодаря возможности выполнять обе операции одновременно (и из-за того, что не требуется IPC между
uniq
иsort
). Особенно, если файл большой,sort -u
вероятно , будет использовать меньше промежуточных файлов для сортировки данных.В моей системе я последовательно получаю такие результаты:
Он также не скрывает код возврата
sort
, который может быть важным (в современных оболочках есть способы , чтобы получить это, например,bash
«s$PIPESTATUS
массив, но это не всегда верно).источник
sort | uniq
потому что 9 раз из 10, я на самом деле обожаюuniq -c
.sort -u
было частью 7-го издания UNIX, около 1979 года. Версииsort
без поддержки-u
действительно архаичны - или были написаны без учета стандарта де-факто до стандарта де-юре POSIX. См. Также Переполнение стека Sort & uniq в оболочке Linux с 2010 года.ip
. Это 2016 год, а этот пост в 2013 году, но я знаю только оip
команде сейчас.uniq -c
» (и, возможно, пайпинг еще раз кsort -nr | head
). Мне было интересно, что является эквивалентомsort | uniq
в Vim, когда я узнал, что у Vim есть:sort u
команда. И TIL такжеsort -u
существует.sort -n | uniq
противsort -n -u
. Например, конечные и ведущие пробелы будут рассматриваться как дубликаты,sort -n -u
но не первыми!echo -e 'test \n test' | sort -n -u
возвращаетtest
, ноecho -e 'test \n test' | sort -n | uniq
возвращает обе строки.Одно из отличий состоит в том, что у
uniq
него есть ряд полезных дополнительных опций, таких как пропуск полей для сравнения и подсчет количества повторений значения.sort
«ы-u
флаг реализует только функциональность неукрашеннойuniq
команды.источник
sort -u
не может быть передан дляuniq
использования некоторых полезных опций последнего, таких как пропуск полей для сравнения и подсчет количества повторений».С POSIX-совместимыми
sort
s иuniq
s (GNUuniq
в настоящее время не совместим в этом отношении), есть различие в том, чтоsort
используется алгоритм сортировки локали для сравнения строк (обычно используетсяstrcoll()
для сравнения строк) приuniq
проверке идентичности байтового значения (обычно используетсяstrcmp()
) ,Это важно как минимум по двум причинам.
В некоторых локалях, особенно в системах GNU, есть разные символы, которые сортируют одинаково. Например, в локали en_US.UTF-8 в системе GNU все символы ①②③④⑤⑥⑦⑧⑨⑩ ... и многие другие сортируют одинаково, поскольку их порядок сортировки не определен. Арабские цифры 0123456789 сортируются так же, как и их аналоги на восточном арабском языке (٠١٢٣٤٥٦٧٨٩).
Для
sort -u
, ① сортирует так же, как ② и 0123, то же самое, что и ٠١٢٣, поэтомуsort -u
будет сохранять только один из каждого, в то время как дляuniq
(не GNU,uniq
который используетstrcoll()
(кроме как с-i
)), ① отличается от ② и 0123 отличается от ٠١٢٣, поэтомуuniq
будет рассматривать все 4 уникальных.strcoll
может сравнивать только строки допустимых символов (поведение не определено в соответствии с POSIX, когда на входе есть последовательности байтов, которые не образуют допустимых символов),strcmp()
но не заботится о символах, поскольку выполняет только побайтное сравнение. Так что это еще одна причина, почему выsort -u
можете не дать вам все уникальные строки, если некоторые из них не образуют корректный текст.sort|uniq
хотя он не определен для нетекстового ввода, на практике с большей вероятностью по этой причине вы получите уникальные строки.Помимо этих тонкостей, одна вещь , которую не было замечено до сих пор является то , что
uniq
сравнивает всю линию лексически, в то время какsort
«s-u
сопоставляются на основе спецификации сортировки , заданной в командной строке.источник
Я предпочитаю использовать,
sort | uniq
потому что, когда я пытаюсь использовать-u
опцию (исключить дубликаты) для удаления дубликатов, включающих строки со смешанным регистром, не так просто понять результат.Примечание: прежде чем вы сможете запустить приведенные ниже примеры, вам нужно смоделировать стандартную последовательность сортировки C, выполнив следующие действия:
Например, если я хочу отсортировать файл и удалить дубликаты, в то же время сохраняя разные случаи строк различными.
Эта путаница
-u
устраняется, если не использовать опцию удаления дубликатов. Использованиеuniq
более предсказуемо. Нижеследующее сначала сортирует и игнорирует регистр, а затем передает его,uniq
чтобы удалить дубликаты.источник
-u
опцияsort
вывода первого из равного прогона (см. справочную страницу). Таким образом,sort -fu
выявляет первое вхождение каждой нечувствительной к регистру уникальной строки. Логика, котораяsort
используется для удаления дубликатов, предсказуема.Еще одно отличие, которое я обнаружил сегодня, заключается в том, что при сортировке по разделителю
sort -u
применяется уникальный флаг только для столбца, с которым вы сортируете.источник