Подтвердить что ты не робот

Сортировка и uniq в оболочке Linux

В чем разница между следующими командами?

sort -u FILE

sort FILE | uniq
4b9b3361

Ответ 1

Использование '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, и эта операция гарантирована безопасно (файл считывается перед тем, как быть перезаписанным для вывода).

Ответ 2

Есть одна небольшая разница: код возврата.

Дело в том, что если 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

Кроме этого, команды эквивалентны.

Ответ 3

Осторожно! Хотя верно, что "sort -u" и "sort | uniq" эквивалентны, любые дополнительные параметры сортировки могут нарушить эквивалентность. Вот пример из руководства coreutils:

Например, "sort -n -u" проверяет только значение начальной числовой строки при проверке уникальности, тогда как "sort -n | uniq 'проверяет всю строку.

Аналогично, если вы сортируете по ключевым полям, тест уникальности, используемый сортировкой, не обязательно будет рассматривать всю строку. После того, как я укусил эту ошибку в прошлом, в наши дни я стараюсь использовать "sort | uniq" при написании сценариев Bash. Я предпочел бы увеличить накладные расходы ввода-вывода, чем риск того, что кто-то из магазина не узнает об этом конкретном ловушке, когда они изменят мой код, чтобы добавить дополнительные параметры сортировки.

Ответ 5

Ничего, они будут давать тот же результат

Ответ 6

Я работал на некоторых серверах, где сортировка не поддерживает параметр -u. там мы должны использовать

sort xyz | uniq