Вид и uniq в оболочке Linux

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

sort -u FILE

sort FILE | uniq
49
задан Chris Seymour 27 December 2012 в 03:55
поделиться

5 ответов

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

81
ответ дан 7 November 2019 в 11:33
поделиться

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

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

В остальном команды эквивалентны.

10
ответ дан 7 November 2019 в 11:33
поделиться

sort -u будет немного быстрее, потому что ему не нужно передавать вывод между двумя командами

также смотрите мой вопрос по теме: вызов uniq и sort в разных порядках в shell

6
ответ дан 7 November 2019 в 11:33
поделиться

Ничего, они дадут одинаковый результат

2
ответ дан 7 November 2019 в 11:33
поделиться

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

sort xyz | uniq
1
ответ дан 7 November 2019 в 11:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: