2010-08-01 3 views
36

В чем разница между приведенными ниже командами?Sort and uniq в оболочке Linux

sort -u FILE 

sort FILE | uniq 
+0

Когда вы запускали их, что вы видели? Вы пытались собрать временные различия для файлов разных размеров? Вы можете провести несколько экспериментов и опубликовать результаты, которые являются частью вашего вопроса. –

+0

Я хочу знать, если есть специальный случай, когда обе команды ведут себя по-другому, при нормальном выполнении они оба дают одинаковые результаты. – yassin

+3

[В чем разница между «sort -u» и «sort | uniq "?] (http://unix.stackexchange.com/q/76049/17265) – mtk

ответ

59

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

+0

Спасибо за полный ответ! – yassin

+0

gnu sort не имеет способа сделать все 'sort | uniq -c | sort -n', и я также не нашел другого инструмента, чтобы сделать это эффективно. Кажется, что стоит подставить код. – mc0e

2

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

10

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

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

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

0

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

sort xyz | uniq 
+1

Не хотите ли вы указать, на каких серверах, с какой версией o/s и когда, примерно? 7-й выпуск UNIX ™ 'sort' поддерживал' -u', и это была первая широко используемая версия UNIX, поэтому все остальные (System III, System V, BSD и т. Д.) Имели тенденцию следовать за ней, поэтому я был бы очень удивлен найти Unix-подобную систему, где 'sort' не поддерживал' -u'. –

6

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

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

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

Смежные вопросы