В чем разница между следующими командами?
sort -u FILE
sort FILE | uniq
В чем разница между следующими командами?
sort -u FILE
sort FILE | uniq
Использование 'sort -u' делает меньше ввода-вывода, чем 'sort | uniq ', но чистый результат один и тот же. В частности, если файл достаточно большой, чтобы сортировка создавала промежуточные файлы, есть приличная вероятность, что "sort -u" будет использовать несколько меньшие или несколько меньшие промежуточные файлы, так как он может устранить дубликаты при сортировке каждого набора. Если данные являются сильно дублирующими, это может быть полезно; если на самом деле имеется несколько дубликатов, это не будет иметь большого значения (определенно эффект производительности второго порядка, по сравнению с эффектом первого порядка в трубе).
Обратите внимание, что там, где подходит трубопровод. Например:
sort FILE | uniq -c | sort -n
Сортирует файл в порядке количества вхождений каждой строки в файле, причем самые повторяющиеся строки появляются последними. (Не удивительно, что эта комбинация, которая является идиоматической для Unix или POSIX, может быть запущена в одну сложную команду "sort" с сортировкой GNU.)
Бывают случаи, когда не используется труба. Например:
sort -u -o FILE FILE
Это сортирует файл 'in situ'; то есть выходной файл указан -o FILE
, и эта операция гарантирована безопасно (файл считывается перед тем, как быть перезаписанным для вывода).
Есть одна небольшая разница: код возврата.
Дело в том, что если shopt -o pipefail
не установлен, код возврата команды piped будет кодом возврата последнего. И uniq
всегда возвращает ноль (успех). Попробуйте изучить код выхода, и вы увидите что-то вроде этого (pipefail
здесь не задано):
[email protected] ~ $ sort -u file_that_doesnt_exist ; echo $?
sort: open failed: file_that_doesnt_exist: No such file or directory
2
[email protected] ~ $ sort file_that_doesnt_exist | uniq ; echo $?
sort: open failed: file_that_doesnt_exist: No such file or directory
0
Кроме этого, команды эквивалентны.
Осторожно! Хотя верно, что "sort -u" и "sort | uniq" эквивалентны, любые дополнительные параметры сортировки могут нарушить эквивалентность. Вот пример из руководства coreutils:
Например, "sort -n -u" проверяет только значение начальной числовой строки при проверке уникальности, тогда как "sort -n | uniq 'проверяет всю строку.
Аналогично, если вы сортируете по ключевым полям, тест уникальности, используемый сортировкой, не обязательно будет рассматривать всю строку. После того, как я укусил эту ошибку в прошлом, в наши дни я стараюсь использовать "sort | uniq" при написании сценариев Bash. Я предпочел бы увеличить накладные расходы ввода-вывода, чем риск того, что кто-то из магазина не узнает об этом конкретном ловушке, когда они изменят мой код, чтобы добавить дополнительные параметры сортировки.
sort -u
будет немного быстрее, потому что ему не нужно транслировать вывод между двумя командами
также см. мой вопрос по теме: вызов uniq и сортировка в разных заказах в оболочке
Ничего, они будут давать тот же результат
Я работал на некоторых серверах, где сортировка не поддерживает параметр -u. там мы должны использовать
sort xyz | uniq