В чем разница между sort -u и uniq?

Мне нужен скрипт, который сортирует текстовый файл и удаляет дубликаты. В большинстве, если не во всех, примерах используется подход sort file1 | uniq > file2. Однако в мужской сортировке есть параметр -u, который делает это во время сортировки.

Есть ли причина использовать один над другим? Может быть, доступность опции -u? Или проблема с памятью/скоростью?


person Stoinov    schedule 09.03.2014    source источник
comment
полная копия В чем разница между «сортировкой -u» и «сортировать | уникальный”?   -  person underscore_d    schedule 28.09.2017


Ответы (5)


Я не уверен, что дело в доступности. Большинство систем, которые я когда-либо видел, имеют sort и uniq, поскольку они обычно предоставляются одним и тем же пакетом. Я только что проверил систему Solaris 2001 года, и у нее sort есть опция -u.

Технически, использование linux pipe (|) запускает подоболочку и будет более ресурсоемким, поскольку запрашивает несколько pid из ОС.

Если вы перейдете к исходному коду для sort , который входит в пакет coreutils, вы можете видеть, что он на самом деле просто пропускает печать дубликатов, поскольку печатает свой собственный отсортированный список и не использует независимый uniq код.

Чтобы увидеть, как это работает, перейдите по ссылке на источник сортировки и посмотрите функции под этим комментарием:

 /* If uniquified output is turned on, output only the first of
   an identical series of lines. */

Хотя я считаю, что sort -u должен быть быстрее, прирост производительности на самом деле будет минимальным, если только вы не запускаете sort | uniq с огромными файлами, так как ему придется снова считывать весь файл.

person cmrust    schedule 09.03.2014

В простом случае они должны быть эквивалентны, но будут вести себя по-разному, если вы используете параметр -k для определения только определенных полей строки ввода для использования в качестве ключей сортировки. В этом случае sort -u будет подавлять строки с одним и тем же ключом, даже если другие части строки различаются, тогда как uniq будет подавлять только абсолютно идентичные строки.

$ cat example 
foo baz
quux ping
foo bar
$ sort -k 1,1 --stable example # use just the first word as sort key
foo baz
foo bar
quux ping
$ sort -k 1,1 --stable -u example # suppress lines with the same first word
foo baz
quux ping

но

$ sort -k 1,1 --stable example | uniq
foo baz
foo bar
quux ping
person Ian Roberts    schedule 09.03.2014
comment
Я понимаю последствия использования дополнительных параметров, но мне просто интересно узнать об основных функциях, как в данном примере. - person Stoinov; 10.03.2014

Одно отличие состоит в том, что 'uniq -c' может подсчитывать (и печатать) количество совпадений. Вы теряете эту возможность, когда используете sort -c для сортировки.

person Oktay    schedule 08.10.2020

Они должны быть функционально эквивалентны, а sort -u должны быть более эффективными.

Я предполагаю, что примеры, на которые вы смотрите, просто не рассматривали (или не имели) «sort -u» в качестве опции.

person FoggyDay    schedule 09.03.2014

uniq сортирует? Я так не думаю... Потому что, по крайней мере, на Ubuntu 18.04 и CentOS 6 это не так. Он просто удалит последовательные дубликаты.

Можно просто провести мини-эксперимент.

Пусть файл sample.txt будет:

a
a
a
b
b
b
a
a
a
b
b
b

cat sample.txt | uniq выведет:

a
b
a
b

в то время как cat sample.txt | sort -u выведет:

a
b

sort | uniq может быть функционально эквивалентно sort -u.

person ghchoi    schedule 14.08.2019