GNU/Linux >> Tutoriales Linux >  >> Linux

Especifique el orden de clasificación con LC_COLLATE para que las minúsculas estén antes que las mayúsculas

No conozco ninguna configuración regional que, de forma predeterminada, ordene en ese orden. La solución es crear una configuración regional personalizada con un orden de clasificación personalizado. Si alguien, cuatro años después, quiere clasificar de forma personalizada, este es el truco.

La gran mayoría de las configuraciones regionales no especifican su propio orden de clasificación, sino que copian el orden de clasificación definido en /usr/share/i18n/locales/iso14651_t1_common así que eso es lo que querrás editar. En lugar de cambiar el orden de clasificación para casi todas las configuraciones regionales modificando el iso14651_t1_common original , le sugiero que haga una copia. Detalles sobre cómo funciona el orden de clasificación y cómo crear una configuración regional personalizada en su $HOME directorio sin acceso raíz se encuentran en esta respuesta a una pregunta similar.

Mira cómo a y A se ordenan según sus entradas en iso14651_t1_common :

<U0061> <a>;<BAS>;<MIN>;IGNORE # 198 a
<U0041> <a>;<BAS>;<CAP>;IGNORE # 517 A

b y B son similares:

<U0062> <b>;<BAS>;<MIN>;IGNORE # 233 b
<U0042> <b>;<BAS>;<CAP>;IGNORE # 550 B

Vemos que en el primer pase, ambos a y A tener el símbolo de clasificación <a> , mientras que ambos b y B tener el símbolo de clasificación <b> . Desde <a> aparece antes de <b> en iso14651_t1_common , a y A están empatados antes de b y B . El segundo pase no rompe los empates porque los cuatro caracteres tienen el símbolo de clasificación <BAS> , pero en la tercera pasada se resuelven los empates porque el símbolo de cotejo para letras minúsculas <MIN> aparece en la línea 3467, antes del símbolo de clasificación para letras mayúsculas <CAP> (línea 3488). Entonces el orden de clasificación termina como a , A , b , B .

Al intercambiar el primer y el tercer símbolo de clasificación, las letras se ordenarían primero por mayúsculas y minúsculas (inferior y luego superior), luego por acento (<BAS> significa sin acento), luego por orden alfabético. Sin embargo , ambos <MIN> y <CAP> vienen antes de los dígitos numéricos, por lo que esto tendría el efecto no deseado de poner los dígitos después de las letras.

La forma más fácil de mantener los dígitos primero al hacer todo las letras minúsculas van antes de todas mayúsculas es obligar a todas las letras a empatar durante la primera comparación estableciéndolas todas iguales a <a> . Para asegurarse de que se ordenen alfabéticamente entre mayúsculas y minúsculas, cambie el último símbolo de clasificación de IGNORE al primer símbolo de clasificación actual. Siguiendo este patrón, a se convertiría en:

<U0061> <a>;<BAS>;<MIN>;<a> # 198 a

A se convertiría en:

<U0041> <a>;<BAS>;<CAP>;<a> # 517 A

b se convertiría en:

<U0062> <a>;<BAS>;<MIN>;<b> # 233 b

B se convertiría en:

<U0042> <a>;<BAS>;<CAP>;<b> # 550 B

y así sucesivamente para el resto de las letras.

Una vez que haya creado una versión personalizada de iso14651_t1_common , siga las instrucciones en la respuesta vinculada anteriormente para compilar su configuración regional personalizada.


Configuración LC_COLLATE=C no siempre es suficiente ordenar mayúsculas antes que minúsculas. Es posible que deba configurar LC_ALL=C .

Eso también tendrá en cuenta los caracteres no alfanuméricos e incluso los no imprimibles, pero si no quieres eso, hay opciones -d y -i (descrito en man sort ) para desactivarlo.

Sin embargo, probablemente fallará gravemente con la entrada multibyte, como UTF-8 con caracteres que no sean ASCII.

Para obtener minúsculas (en orden) antes de mayúsculas (en orden), la mejor manera que se me ocurre no implica romper un lenguaje de programación completo es invertir el caso de todas las letras antes de ordenar e invertirlas de nuevo después.

tr 'a-zA-Z' 'A-Za-z' < file | LC_ALL=C sort | tr 'a-zA-Z' 'A-Za-z'

No soy un experto, pero nunca he visto una configuración regional que defina la intercalación de esta manera. AFAIK, esta intercalación solo está en C, donde se basa en valores ASCII. (Normalmente, solo resolvería esto con un script).

Sin embargo, nunca he hecho esto, pero es posible que desee consultar las páginas de manual de localedef(1) y locale(5) para comprender cómo se definen las configuraciones regionales y eventualmente definir la suya propia.

Además, no olvide que si hay signos diacríticos o caracteres especiales, C locale no los tratará como le gustaría. Por ejemplo, no pondrá á cerca de a o Ł cerca de L . En tales casos, la configuración regional nativa del idioma probablemente sea un mejor punto de partida.


Linux
  1. Analizar el kernel de Linux con ftrace

  2. Ordenarse con ordenar en la línea de comando

  3. Deshabilitar el inicio de sesión con la cuenta raíz

  4. Mejorar la colaboración con la nube

  5. Ordenar en el último campo de una línea

Aprende Linux con la Raspberry Pi

Comando de clasificación de Linux con ejemplos

10 ejemplos útiles del comando Sort en Linux

Asegure Linux con el archivo Sudoers

Clasificación de varias claves con clasificación de Unix

'&&' vs. '&' con el comando 'test' en Bash