Por que 'classificação' ignora caracteres especiais, como o asterisco?


27

Eu pensei que sortiria ordenar prefixos comuns, mas isso nem sempre acontece. Tome esta entrada por exemplo:

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

Depois sort, eu esperaria que tudo AT*acabasse em um pedaço, mas quando você executa esses dados sort, a ==entrada de saída . Por que é que? Não estou especificando nenhuma opção para ignorar caracteres não alfabéticos ou algo assim. Apenas sort dict > out.

Minha versão sortvem coreutils 8.5-1ubuntu3.


Funciona para mim. Talvez um apelido em algum lugar?
Matthieu Cartier

Respostas:


17
sort --version-sort filename 

Isso preserva a ordem natural dos números.


4
+1 Isso funciona, mas por quê? Existem apenas alguns dígitos no texto.
Aaron Digulla

2
Funciona sem a necessidade de alterar o ambiente, +1
Meredith

@AaronDigulla: Eu suspeito que ele trata as seqüências de caracteres na versão como a maneira mais idiota de classificar as coisas, por isso ignora a localidade e apenas lida com números de uma maneira especial.
JohnEye

23

Definir LC_ALL = C restaurou a ordem de classificação tradicional no meu caso. Pacote: coreutils Versão: 8.5-1ubuntu3

export LC_ALL=C 

LANG=Ctambém funciona. O que me intriga: LANGestá definido como en_US.UTF-8; por que *ainda é tratado especial ??
Aaron Digulla

2
LC_COLLATEé a configuração específica para sortetc.
Pausada até novo aviso.

funciona para mim em Raspbian // Pixel ... o tipo 'aborrecimento' que ignorava os caracteres especiais estava me matando ... obrigado.
ZEE 12/10

2
não é necessário exportou mesmo definir local e possivelmente mexer com outra coisa. Basta configurá-lo na chamada para espécie: LC_ALL=C sort. Por exemplo echo -e 'a\n*\n*b\nc' | LC_ALL=C sort, LC_ALL não será alterado fora da chamada para classificação
Hashbrown 25/09

1

Funciona como esperado para mim (no cygwin).

sort input > output resulta em

UM POUCO
Um pouco
AT * Eydie
AT * eu
AT * DIU
AT * Ito
AT * OD
AT * UT
AT * Uta
AT * Wyatt
Um pouco
AT * eyed
AT * id
AT * aveia
AT * superam
AT * devido
AT * impressionado
AT0S * oitocentos
AT0S * óculos
ATF * ATV
ATF * Ediva
ATF * adv
ATF * edify
Advogado ATFKT *
ATFKT * superado
ATFKTNK * defendendo
Advogados do ATFKTS *
ATHT * Whitehead
ATHT * whitehead
ATJ * adágio
ATNXNS * atenção
ATNXNS * de atenuação
ATNXNS * de autoignição
ATP * adobe
ATP0K * idiopático
ATT * wighted
ATT * sagaz
ATT * arborizado
ATX * atishoo

A classificação é alias de alguma coisa? experimentar\sort

Além disso

O código do idioma especificado pelo ambiente afeta a ordem de classificação. Defina LC_ALL = C para obter a ordem de classificação tradicional que usa valores de bytes nativos


Sem alias. Deve ser algum recurso específico do ubuntu / debian.
Aaron Digulla

1

Versão: sort (GNU coreutils) 8.26

Eu faço isso em linha:

LANG=C sort FILE

Ou por função (altera o arquivo original):

dosort() { local file="$*"; LANG=C sort ${file} -o ${file}.swp; mv ${file}.swp ${file}; cat ${file} ;}

1

Para fornecer uma resposta simples com base nos comentários de outras pessoas, isso não muda seu ambiente:

input_program | LC_COLLATE=C sort | output_program

ou

LC_COLLATE=C sort < input_file > output_file

ou combinações dos mesmos.


0

Com o GNU sort você pode usar --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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.