sort -un выдаёт непонятный результат

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

sort -un выдаёт непонятный результат

Сообщение sash-kan »

вот такая странная картина:

Shell

$ echo -e '1.2\n1.1' | sort -un 1.1 1.2 $ echo -e '1.1.2\n1.1.1' | sort -un 1.1.2 $ echo -e '1.1.2\n1.1.1' | sort -n 1.1.1 1.1.2 $

почему во втором случае съедается вторая строка?
я чего-то в жизни не понимаю?

ну хорошо. допустим, "1.1" считается числом с плавающей точкой, а "1.1.1" — это, типа, «число, после которого — мусор».
но ведь в третьем случае правильно сортирует!
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo

Re: sort -un выдаёт непонятный результат

Сообщение /dev/random »

Если встречаются несколько строк, которые при выбранном способе сортировки считаются равными, то -u удаляет все, кроме одной. -n выбирает сортировку по числу, находящемуся в начале строки. Если это число одно и то же, то -u, соответственно, удалит все строки с этим числом, кроме одной.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: sort -un выдаёт непонятный результат

Сообщение t.t »

Надо же. Я как-то никогда не задумывался, чем опция sort-а u отличается от uniq. А оказывается, отличается принципиально.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: sort -un выдаёт непонятный результат

Сообщение sash-kan »

t.t писал(а):
04.03.2011 15:27
Надо же. Я как-то никогда не задумывался, чем опция sort-а u отличается от uniq. А оказывается, отличается принципиально.
насколько я вижу, отличается не столько "-u", сколько сочетание "-un". "-u" работает вполне разумно:

Shell

echo -e '1.1.2\n1.1.1' | sort -u 1.1.1 1.1.2


а вот -un имеет какаю-то инопланетянскую логику.
я бы, честно говоря, ни в жисть до такого не додумался.

вообще, по-моему, это баг. боюсь только, что лет двадцать назад его признали фичей.

/dev/random писал(а):
04.03.2011 14:03
-n выбирает сортировку по числу, находящемуся в начале строки
третий пример этому противоречит. порядок строк поменялся, хотя число там одно и то же.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo

Re: sort -un выдаёт непонятный результат

Сообщение /dev/random »

sash-kan писал(а):
04.03.2011 16:25
а вот -un имеет какаю-то инопланетянскую логику.
я бы, честно говоря, ни в жисть до такого не додумался.

Не -un, а -u в сочетании с любым флагом, уточняющим критерии сортировки. Только эти уточнённые критерии и будут использоваться для сравнения строк, и в т.ч. для удаления дублей.

sash-kan писал(а):
04.03.2011 16:25
третий пример этому противоречит. порядок строк поменялся, хотя число там одно и то же.

Не противоречит. По-умолчанию используется более эффективный, но нестабильный алгоритм. Для использования стабильного нужно указать флаг -s.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: sort -un выдаёт непонятный результат

Сообщение sash-kan »

/dev/random писал(а):
04.03.2011 16:46
sash-kan писал(а):
04.03.2011 16:25
третий пример этому противоречит. порядок строк поменялся, хотя число там одно и то же.

Не противоречит. По-умолчанию используется более эффективный, но нестабильный алгоритм. Для использования стабильного нужно указать флаг -s.
гхм. а где написано про то, что -s использует «более эффективынй» (чем -sn) алгоритм?
и где написано про то, что -un будет сортировать «более стабильным способом», чем -n?
ни в man-е ни в info что-то не вижу про это ни слова. надо протереть иллюминаторы?
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo

Re: sort -un выдаёт непонятный результат

Сообщение /dev/random »

sash-kan писал(а):
04.03.2011 18:30
гхм. а где написано про то, что -s использует «более эффективынй» (чем -sn) алгоритм?
и где написано про то, что -un будет сортировать «более стабильным способом», чем -n?

А где я это сказал? o_O

Специально для непонятливых. Повторяю _всё_, что я сказал в этой теме, в кратком виде.

* Если есть ключи, задающие способ сравнения строк (например, -n), то _только этот способ_ и используется для их сравнения. В том числе и для удаления одинаковых через -u.
* Если _не_ указан ключ -s, то (независимо от прочих ключей) происходит сортировка _нестабильным_ (a.k.a. _неустойчивым_) алгоритмом. Это означает, что строки, считающиеся одинаковыми, могут быть переставлены друг с другом труднопредсказуемым образом. Ключ -s же гарантирует, что они останутся в том же порядке, в котором были.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: sort -un выдаёт непонятный результат

Сообщение t.t »

sash-kan писал(а):
04.03.2011 16:25
t.t писал(а):
04.03.2011 15:27
Надо же. Я как-то никогда не задумывался, чем опция sort-а u отличается от uniq. А оказывается, отличается принципиально.
насколько я вижу, отличается не столько "-u", сколько сочетание "-un". "-u" работает вполне разумно:

Я имел ввиду то, о чём уже сказал Олег: не только с n, но с любым «уточняющим» ключом. Например, очень полезного эффекта можно добиться сочетанием «-ukM,N». И неразумным я бы такое поведение точно не назвал. Скорее не очень разумно отсутствие достаточно подробного описания в мане.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: sort -un выдаёт непонятный результат

Сообщение sash-kan »

t.t писал(а):
04.03.2011 19:51
Скорее не очень разумно отсутствие достаточно подробного описания в мане.
вот я про это /dev/random-у и намекаю. черпание сведения из астрала исходников — не такой эффективный метод познания, как чтение документации.

/dev/random писал(а):
04.03.2011 19:00
Специально для непонятливых.
спасибо за разъяснение. интересовался я в основном другим — _где_ эти знания были почерпнуты. насколько я вижу — не в man/info (или иллюминаторы у меня всё-таки запотели?).
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: sort -un выдаёт непонятный результат

Сообщение Nazyvaemykh »

В операционной системе OpenBSD, кстати, в man sort написано достаточно внятно:

Код: Выделить всё

    -u      Unique: suppress all but one in each set of lines having equal
             keys.  If used with the -C or -c options, also check that there
             are no lines with duplicate keys.
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo

Re: sort -un выдаёт непонятный результат

Сообщение /dev/random »

sash-kan писал(а):
05.03.2011 10:13
интересовался я в основном другим — _где_ эти знания были почерпнуты.

Где-то в бумажной литературе, много лет назад, во времена освоения линукса.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: sort -un выдаёт непонятный результат

Сообщение drBatty »

странно...
у меня всё это подробно расписано:

Код: Выделить всё

DESCRIPTION
       With the "sort" pragma you can control the behaviour of the builtin
       "sort()" function.

       In Perl versions 5.6 and earlier the quicksort algorithm was used to
       implement "sort()", but in Perl 5.8 a mergesort algorithm was also made
       available, mainly to guarantee worst case O(N log N) behaviour: the
       worst case of quicksort is O(N**2).  In Perl 5.8 and later, quicksort
       defends against quadratic behaviour by shuffling large arrays before
       sorting.

       A stable sort means that for records that compare equal, the original
       input ordering is preserved.  Mergesort is stable, quicksort is not.
       Stability will matter only if elements that compare equal can be
       distinguished in some other way.  That means that simple numerical and
       lexical sorts do not profit from stability, since equal elements are
       indistinguishable.  However, with a comparison such as

          { substr($a, 0, 3) cmp substr($b, 0, 3) }

       stability might matter because elements that compare equal on the first
       3 characters may be distinguished based on subsequent characters.  In
       Perl 5.8 and later, quicksort can be stabilized, but doing so will add
       overhead, so it should only be done if it matters.

       The best algorithm depends on many things.  On average, mergesort does
       fewer comparisons than quicksort, so it may be better when complicated
       comparison routines are used.  Mergesort also takes advantage of pre-
       existing order, so it would be favored for using "sort()" to merge
       several sorted arrays.  On the other hand, quicksort is often faster
       for small arrays, and on arrays of a few distinct values, repeated many
       times.  You can force the choice of algorithm with this pragma, but
       this feels heavy-handed, so the subpragmas beginning with a "_" may not
       persist beyond Perl 5.8.  The default algorithm is mergesort, which
       will be stable even if you do not explicitly demand it.  But the
       stability of the default sort is a side-effect that could change in
       later versions.  If stability is important, be sure to say so with a

         use sort 'stable';

       The "no sort" pragma doesn't forbid what follows, it just leaves the
       choice open.  Thus, after

         no sort qw(_mergesort stable);
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: sort -un выдаёт непонятный результат

Сообщение drBatty »

вообще говоря очевидно, что массив 1,1,1 после сортировки останется таким-же. Однако, никто не гарантировал, что сортировка не станет менять местами эти единички. Будет. Если ей так удобнее. qsort почти всегда меняет.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: sort -un выдаёт непонятный результат

Сообщение t.t »

drBatty, а при чём здесь перл?
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: sort -un выдаёт непонятный результат

Сообщение drBatty »

t.t писал(а):
06.03.2011 17:19
drBatty, а при чём здесь перл?

не знаю. открыл info sort
File: *manpages*, Node: sort, Up: (dir)

SORT(1) User Commands SORT(1)



NAME
sort - sort lines of text files

SYNOPSIS
sort [OPTION]... [FILE]...
sort [OPTION]... --files0-from=F


а дальше - вы видели. как я понял, поведение утилиты sort эквивалентно встроенной (в перловку) функции sort()
With the "sort" pragma you can control the behaviour of the builtin
"sort()" function.



PS: прошу прощения, что вчера об этом не написал - отвлекли :(
потом забыл.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
bormant
Сообщения: 1354

Re: sort -un выдаёт непонятный результат

Сообщение bormant »

Полагаю, что при указании ключа -n, по каждой строке рассчитывается числовой (numeric) ключ, которые впоследствии и используются для сравнения. Для 1.1.1 получается ключ 1.1, для 1.1.2 получается ключ 1.1, строки 1.1.1 и 1.1.2 хотя и не равны лексикографически, имеют равные ключи сортировки -- 1.1.
Ключ -u заставляет подавлять вывод строк с неуникальными ключами, будет выведена только одна строка с ключом 1.1. В данном случае -- первая из встретившихся -- "1.1.2".
Спасибо сказали:
Аватара пользователя
taaroa
Сообщения: 1319

Re: sort -un выдаёт непонятный результат

Сообщение taaroa »

Nazyvaemykh писал(а):
05.03.2011 10:20
В операционной системе OpenBSD

[offtop]
With UNIX, if you're looking for something, you can easily and quickly check that small manual and find out it's not there. With VMS, no matter what you look for - it's literally a five-foot shelf of documentation - if you look long enough it's there. That's the difference - the beauty of UNIX is that it's simple; and the beauty of VMS is that it's all there. © Ken Olsen, President of DEC, 1984. R.I.P.
[offtop]
:wq
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: sort -un выдаёт непонятный результат

Сообщение drBatty »

bormant писал(а):
06.03.2011 21:13
Ключ -u заставляет подавлять вывод строк с неуникальными ключами, будет выведена только одна строка с ключом 1.1. В данном случае -- первая из встретившихся -- "1.1.2".

ИМХО нет. Строки сначала сортируются, а потом выводится первое в отсортированном. В силу того, что сортировка неустойчивая, строки с равными ключами могут поменяться местами. И если сейчас (если верить моему мануалу) сортировка устойчивая, то в будущих версиях (если верить тому-же мануалу) она может стать неустойчивой, и порядок строк будет меняться.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo

Re: sort -un выдаёт непонятный результат

Сообщение /dev/random »

drBatty писал(а):
07.03.2011 13:10
И если сейчас (если верить моему мануалу) сортировка устойчивая, то в будущих версиях (если верить тому-же мануалу) она может стать неустойчивой, и порядок строк будет меняться.

Чтобы она была устойчивой, используется ключ -s. А без него лично у меня и сейчас неустойчивая.

Вообще, у меня такой ощущение, что у вас sort не из gnu coreutils, а какой-то другой.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: sort -un выдаёт непонятный результат

Сообщение drBatty »

/dev/random писал(а):
07.03.2011 13:14
Вообще, у меня такой ощущение, что у вас sort не из gnu coreutils, а какой-то другой.

возможно.
однако, если скачать http://ftp.gnu.org/gnu/coreutils/coreutils-8.9.tar.xz, и почитать info оттуда, то можно тоже найти информацию по нашему вопросу:
The
IPv4 addresses are sorted lexicographically. The second sort uses
`-s' so that ties in the primary key are broken by the secondary
key; the first sort uses `-s' so that the combination of the two
sorts is stable.

ну а понятие "(не)стабильная сортировка" вообще говоря к sort не имеет отношения. и к линуксу вообще. Это ИМХО теория алгоритмов, и в мане достаточно написать, что по второму ключу сортировка даёт неожиданный результат, ибо нестабильная.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: