Почему «сортировка» игнорирует специальные символы, такие как звездочка?

27

Я думал, что это sortбудет сортировать общие префиксы вместе, но это не всегда происходит. Возьмите этот вход, например:

AT0S*eightieths
AT0S*eyetooth's
AT*ad
AT*Ad
AT*AD
AT*Eydie
AT*eyed
ATF*adv
ATF*ATV
ATF*edify
ATF*Ediva
ATFKT*advocate
ATFKTNK*advocating
ATFKT*outfought
ATFKTS*advocates
ATHT*whitehead
ATHT*Whitehead
AT*id
AT*I'd
AT*Ito
AT*IUD
ATJ*adage
ATNXNS*attention's
ATNXNS*attenuation's
ATNXNS*autoignition's
AT*oat
AT*OD
AT*outweigh
AT*owed
ATP0K*idiopathic
ATP*adobe
ATT*wighted
ATT*witted
ATT*wooded
AT*UT
AT*Uta
AT*wowed
AT*Wyatt
ATX*atishoo

После sortэтого я ожидал, что все AT*закончится в одном куске, но когда вы пропустите эти данные sort, появится выходной ==ввод. Почему это? Я не указываю никакой опции, чтобы игнорировать не алфавитные символы или что-то еще. Так же sort dict > out.

Моя версия sortисходит от coreutils 8.5-1ubuntu3.

Аарон Дигулла
источник
Работает для меня. Может быть, псевдоним где-нибудь?
Матье Картье

Ответы:

17
sort --version-sort filename 

Это сохраняет естественный порядок чисел.

Рувим Л.
источник
4
+1 Это работает, но почему? В тексте всего несколько однозначных цифр.
Аарон Дигулла
2
Работает без необходимости менять среду, +1
Мередит
@AaronDigulla: я подозреваю, что он рассматривает строки в сортировке версий как почти самый глупый способ сортировки, поэтому он игнорирует локаль и обрабатывает числа особым образом.
JohnEye
23

Установка LC_ALL = C восстановила традиционный порядок сортировки в моем случае. Пакет: coreutils Версия: 8.5-1ubuntu3

export LC_ALL=C 
rahul_jk
источник
LANG=Cтоже работает. Что меня озадачивает: LANGнастроено на en_US.UTF-8; почему до *сих пор лечатся ??
Аарон Дигулла
2
LC_COLLATEэто особая настройка и sortт. д.
Приостановлено до дальнейшего уведомления.
работает для меня в Raspbian // Pixel ... своего рода «раздражение», игнорирующее специальные символы, убило меня ... спасибо.
ZEE
2
нет необходимости exportили даже устанавливать локальные и, возможно, связываться с чем-то еще. Просто установите его в вызове рода: LC_ALL=C sort. Например echo -e 'a\n*\n*b\nc' | LC_ALL=C sort, LC_ALL не будет изменен вне вызова сортировки
Hashbrown
1

Это работает, как и ожидалось для меня (на Cygwin).

sort input > output результаты в

ЧУТЬ-ЧУТЬ
Чуть-чуть
AT * Eydie
AT * Я бы
AT * ИСД
AT * Ito
AT * OD
AT * UT
AT * Uta
AT * Wyatt
Чуть-чуть
AT * глаз
AT * ид
AT * овес
AT * перевешивают
AT * задолженность
AT * поразил
AT0S * eightieths
AT0S * eyetooth-х
ATF * ATV
ATF * Ediva
ATF * нареч
ATF * назидайте
ATFKT * адвокат
ATFKT * outfought
ATFKTNK * Пропаганда
ATFKTS * сторонников
ATHT * Уайтхед
ATHT * Уайтхед
ATJ * изречение
ATNXNS * внимание-х
ATNXNS * затухание-х
ATNXNS * самовоспламенения-х
АТП * саман
ATP0K * идиопатический
ATT * wighted
ATT * сообразительный
ATT * лесистой
ATX * atishoo

Сортируется ли что-то? пытаться\sort

Также

Локаль, указанная средой, влияет на порядок сортировки. Установите LC_ALL = C, чтобы получить традиционный порядок сортировки, который использует собственные значения байтов

Nifle
источник
Нет псевдонима. Должно быть какая-то особенность Ubuntu / Debian.
Аарон Дигулла
1

Версия: sort (GNU coreutils) 8.26

Я делаю это в строке:

LANG=C sort FILE

Или по функции (изменяет исходный файл):

dosort() { local file="$*"; LANG=C sort ${file} -o ${file}.swp; mv ${file}.swp ${file}; cat ${file} ;}
Реджис Барбоса
источник
1

Чтобы предоставить простой ответ, основанный на комментариях других, это не изменит вашу среду:

input_program | LC_COLLATE=C sort | output_program

или

LC_COLLATE=C sort < input_file > output_file

или их комбинации.

WALF
источник
0

С сортировкой GNU вы можете использовать --dictionary-order:

NAME
       sort - sort lines of text files

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

DESCRIPTION
       Write sorted concatenation of all FILE(s) to standard output.

       With no FILE, or when FILE is -, read standard input.

       Mandatory arguments to long options are mandatory for short options too.  Ordering options:

       -b, --ignore-leading-blanks
              ignore leading blanks

       -d, --dictionary-order
              consider only blanks and alphanumeric characters
Игорь
источник