¿Por qué 'ordenar' ignora los caracteres especiales, como el asterisco?

27

Pensé que eso sortordenaría los prefijos comunes, pero eso no siempre sucede. Tome esta entrada por ejemplo:

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

Después sort, esperaría que todo AT*terminara en un trozo, pero cuando ejecuta estos datos sort, la ==entrada de salida . ¿Porqué es eso? No estoy especificando ninguna opción para ignorar los caracteres no alfabéticos ni nada. Justo sort dict > out.

Mi versión de sortviene de coreutils 8.5-1ubuntu3.

Aaron Digulla
fuente
Funciona para mi. Tal vez un alias en alguna parte?
Matthieu Cartier

Respuestas:

17
sort --version-sort filename 

Esto preserva el orden natural de los números.

Rubén L.
fuente
44
+1 Eso funciona pero ¿por qué? Solo hay unos pocos dígitos en el texto.
Aaron Digulla
2
Funciona sin necesidad de cambiar el entorno, +1
Meredith
@AaronDigulla: Sospecho que trata las cadenas en la clasificación de versiones como la forma más tonta de ordenar las cosas, por lo que ignora la configuración regional y solo maneja los números de una manera especial.
JohnEye
23

La configuración LC_ALL = C restauró el orden de clasificación tradicional en mi caso. Paquete: Coreutils Versión: 8.5-1ubuntu3

export LC_ALL=C 
rahul_jk
fuente
LANG=CTambién funciona. Lo que me desconcierta: LANGestá configurado para en_US.UTF-8; ¿Por qué *todavía se trata especial?
Aaron Digulla
2
LC_COLLATEes la configuración específica de sort, etc.
pausa hasta nuevo aviso.
funciona para mí en Raspbian // Pixel ... el tipo de 'molestia' ignorando los caracteres especiales me estaba matando ... gracias.
ZEE
2
no es necesario exporto incluso establecer local y posiblemente meterse con otra cosa Sólo tienes que configurar en la llamada a ordenar: LC_ALL=C sort. Por ejemplo echo -e 'a\n*\n*b\nc' | LC_ALL=C sort, LC_ALL no se cambiará fuera de la llamada para ordenar
Hashbrown
1

Funciona como se esperaba para mí (en Cygwin).

sort input > output resultados en

UN POCO
Un poco
AT * Eydie
AT * yo
AT * DIU
AT * Ito
AT * OD
AT * UT
AT * Uta
AT * Wyatt
Un poco
AT * eyed
AT * id
AT * avena
AT * supera
AT * adeudado
AT * cautivado
AT0S * ochenta
AT0S * eyetooth's
ATF * ATV
ATF * Ediva
ATF * adv
ATF * edify
Defensor ATFKT *
ATFKT * outfought
ATFKTNK * abogando
ATFKTS * aboga
ATHT * Whitehead
ATHT * whitehead
Adagio ATJ *
ATNXNS * atención
ATNXNS * atenuación
ATNXNS * autoignición
ATP * adobe
ATP0K * idiopático
ATT * con cable
ATT * ingenioso
ATT * arbolado
ATX * atishoo

¿Se clasifica alias a algo? tratar\sort

también

La configuración regional especificada por el entorno afecta el orden de clasificación. Establezca LC_ALL = C para obtener el orden de clasificación tradicional que utiliza valores de bytes nativos

Nifle
fuente
Sin alias Debe ser alguna característica específica de ubuntu / debian.
Aaron Digulla
1

Versión: sort (GNU coreutils) 8.26

Lo hago en línea:

LANG=C sort FILE

O por función (cambia el archivo original):

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

Para proporcionar una respuesta simple basada en los comentarios de otros, eso no cambia su entorno:

input_program | LC_COLLATE=C sort | output_program

o

LC_COLLATE=C sort < input_file > output_file

o combinaciones de los mismos.

Walf
fuente
0

Con GNU sort puedes 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
Igor
fuente