Каково различие между следующим к командам?
sort -u FILE
sort FILE | uniq
Использование sort -u
выполняет меньше операций ввода-вывода, чем sort | uniq
, но конечный результат тот же. В частности, если файл достаточно велик, чтобы sort
создавал промежуточные файлы, есть большая вероятность, что sort -u
будет использовать немного меньше или немного меньше промежуточных файлов, поскольку это может исключить дублируется, поскольку он сортирует каждый набор. Если данные сильно дублируются, это может быть полезно; если на самом деле есть несколько дубликатов, это не будет иметь большого значения (определенно эффект производительности второго порядка по сравнению с эффектом первого порядка канала).
Обратите внимание, что в некоторых случаях трубопровод подходит. Например:
sort FILE | uniq -c | sort -n
Сортировка файла по количеству вхождений каждой строки в файле, причем наиболее повторяющиеся строки появляются последними. (Меня не удивило бы, если бы эту комбинацию, которая является идиоматической для Unix или POSIX, можно сжать в одну сложную команду «sort» с помощью GNU sort.)
Бывают случаи, когда важно не использовать канал. Например:
sort -u -o FILE FILE
Сортировка файла "на месте"; то есть выходной файл определяется параметром -o FILE
, и эта операция гарантированно безопасна (файл читается перед перезаписью для вывода).
Есть одно небольшое отличие: код возврата.
Дело в том, что, если не задано shopt -o pipefail
, код возврата переданной команды будет кодом возврата последней. А uniq
всегда возвращает ноль (успех). Попробуйте изучить код выхода, и вы увидите что-то вроде этого ( pipefail
здесь не установлен):
pavel@lonely ~ $ sort -u file_that_doesnt_exist ; echo $?
sort: open failed: file_that_doesnt_exist: No such file or directory
2
pavel@lonely ~ $ sort file_that_doesnt_exist | uniq ; echo $?
sort: open failed: file_that_doesnt_exist: No such file or directory
0
В остальном команды эквивалентны.
sort -u
будет немного быстрее, потому что ему не нужно передавать вывод между двумя командами
также смотрите мой вопрос по теме: вызов uniq и sort в разных порядках в shell
Я работал на некоторых серверах, где sort не поддерживает параметр -u. там мы должны использовать
sort xyz | uniq