В чем разница между приведенными ниже командами?Sort and uniq в оболочке Linux
sort -u FILE
sort FILE | uniq
В чем разница между приведенными ниже командами?Sort and uniq в оболочке Linux
sort -u FILE
sort FILE | uniq
Использование sort -u
делает меньше ввода-вывода, чем sort | uniq
, но конечный результат такой же. В частности, если файл достаточно большой, чтобы sort
должен создавать промежуточные файлы, есть вероятность, что sort -u
будет использовать несколько меньше или немного меньших промежуточных файлов, поскольку он может устранить дубликаты при сортировке каждого набора. Если данные являются сильно дублирующими, это может быть полезно; если на самом деле мало дубликатов, это не будет иметь большого значения (определенно эффект производительности второго порядка, по сравнению с эффектом первого порядка в трубе).
Обратите внимание, что там, где подходит трубопровод. Например:
sort FILE | uniq -c | sort -n
Это сортирует файл в порядке убывания числа вхождений каждой строки в файле, с наиболее повторяющиеся строки появляются в прошлом. (Меня не удивило бы, что эта комбинация, которая является идиоматичной для Unix или POSIX, может быть зажата в одну сложную команду «сортировки» с сортировкой GNU.)
Бывают случаи, когда не используется труба , Например:
sort -u -o FILE FILE
Этот вид файла 'in situ'; то есть выходной файл указывается -o FILE
, и эта операция гарантирована в безопасности (файл считывается перед тем, как быть перезаписанным для вывода).
Ничего, они не будут производить тот же результат
sort -u
будет немного быстрее, потому что не нужно трубы вывода между двумя командами
также увидеть мой вопрос по теме: calling uniq and sort in different orders in shell
Существует одна небольшая разница: код возврата.
Дело в том, что если shopt -o pipefail
не установлен, код возврата команды pipe будет кодом возврата последнего. И 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
Кроме этого, команды эквивалентны.
Я работал на некоторых серверах, где сортировка не поддерживает параметр -u. там мы должны использовать
sort xyz | uniq
Не хотите ли вы указать, на каких серверах, с какой версией o/s и когда, примерно? 7-й выпуск UNIX ™ 'sort' поддерживал' -u', и это была первая широко используемая версия UNIX, поэтому все остальные (System III, System V, BSD и т. Д.) Имели тенденцию следовать за ней, поэтому я был бы очень удивлен найти Unix-подобную систему, где 'sort' не поддерживал' -u'. –
Остерегайтесь! Хотя верно, что «sort -u» и «sort | uniq» эквивалентны, любые дополнительные параметры сортировки могут нарушить эквивалентность. Вот пример из руководства coreutils:
Например, «sort -n -u» проверяет только значение начальной числовой строки при проверке уникальности, тогда как «sort -n | uniq 'проверяет всю строку.
Аналогичным образом, если вы сортируете по ключевым полям, то тест уникальности, используемый сортировкой, не обязательно будет рассматривать всю строку.После укусов этой ошибки в прошлом, в эти дни я обычно использую «sort | uniq» при написании сценариев Bash. Я предпочел бы иметь более высокие накладные расходы ввода-вывода, чем риск того, что кто-то из магазина не узнает об этом конкретном ловушке, когда они изменят мой код, чтобы добавить дополнительные параметры сортировки.
Когда вы запускали их, что вы видели? Вы пытались собрать временные различия для файлов разных размеров? Вы можете провести несколько экспериментов и опубликовать результаты, которые являются частью вашего вопроса. –
Я хочу знать, если есть специальный случай, когда обе команды ведут себя по-другому, при нормальном выполнении они оба дают одинаковые результаты. – yassin
[В чем разница между «sort -u» и «sort | uniq "?] (http://unix.stackexchange.com/q/76049/17265) – mtk