Comando de ordenación de Linux

orden de clasificación

clasificar ordena el contenido de un archivo de texto, línea por línea.

Descripción general

clasificar es un comando simple y muy útil que reorganizará las líneas en un archivo de texto para que estén ordenadas, numérica y alfabéticamente. De forma predeterminada, las reglas de clasificación son:

  • Las líneas que comienzan con un número aparecerán antes de las líneas que comienzan con una letra.
  • Las líneas que comienzan con una letra que aparece antes en el alfabeto aparecerán antes de las líneas que comienzan con una letra que aparece más adelante en el alfabeto.
  • Las líneas que comienzan con una letra minúscula aparecerán antes de las líneas que comienzan con la misma letra en mayúscula.

Las reglas de clasificación se pueden cambiar de acuerdo con las opciones que proporcione al clasificar mando; estos se enumeran a continuación.

Sintaxis

|_+_| |_+_|

Opciones

-b ,
--ignore-lead-espacios en blanco
Ignore los espacios en blanco iniciales.
-D , --orden-diccionario Considere solo espacios en blanco y caracteres alfanuméricos.
-F , --ignorar caso Doble los caracteres de minúscula a mayúscula.
-gramo ,
--orden-numérico-general
Compare de acuerdo con el valor numérico general.
-I , --ignore-nonprinting Considere solo caracteres imprimibles.
-METRO , - ordenado por meses Comparar (desconocido)<' ENE '<... < ' DIC '.
-h ,
--orden-numérico-humano
Comparar números legibles por humanos (p. Ej., ' 2K ', ' 1G ').
-norte , - ordenación numérica Comparar según cuerda valor numérico.
-R , --ordenar al azar Ordenar por hash aleatorio de claves.
--origen-aleatorio = EXPEDIENTE Obtener bytes aleatorios de EXPEDIENTE .
-r , --contrarrestar Invertir el resultado de las comparaciones.
--sort = PALABRA Ordenar según PALABRA : general-numérico -gramo , humano-numérico -h , mes -METRO , numérico -norte , aleatorio -R , versión -V .
-V , --version-sort Tipo natural de números (de versión) dentro del texto.

Otras opciones

- tamaño de lote = NMERGE Fusionar como máximo NMERGE entradas a la vez; para más use archivos temporales.
-c , --cheque ,
--check = diagnosticar primero
Compruebe la entrada ordenada; no clasifique.
-C , --check = tranquilo ,
--check = silencio
Como -c , pero no informe la primera línea incorrecta.
--compress-program = PROG Comprima provisionales con PROG ; descomprimirlos con PROG -D .
--depurar Anote la parte de la línea utilizada para ordenar y advierta sobre el uso cuestionable de stderr.
--files0-from = F Leer la entrada de los archivos especificados por los nombres terminados en NUL en el archivo F ; Si F es '-' luego lee los nombres de la entrada estándar.
-a , --key = POS1 [, POS2 ] Inicie una clave en POS1 (origen 1), termine en POS2 (final de línea predeterminado). Ver POS sintaxis a continuación.
-metro , --ir Fusionar archivos ya ordenados; no clasifique.
-o , --salida = EXPEDIENTE Escribe el resultado en FILE en lugar de la salida estándar.
-s , --estable Estabilice la ordenación desactivando la comparación de último recurso.
-t , --field-separator = SEP Usar SEP en lugar de transición de no blanco a blanco.
-T ,
- directorio-temporal = PARA TI
Usar PARA TI para provisionales, no $ TMPDIR o / tmp ; múltiples opciones especifican múltiples directorios.
--parallel = norte Cambie el número de clases que se ejecutan simultáneamente a norte .
-u , --único Con -c , compruebe el orden estricto; sin -c , genera solo el primero de una ejecución igual.
-con , - terminado en cero Líneas finales con 0 bytes, no nueva línea.
--ayuda Muestre un mensaje de ayuda y salga.
--versión Muestre la información de la versión y salga.

POS toma la forma F [ . C ][ OPCIONES ], dónde F es el número de campo y C la posición del personaje en el campo; ambos son origen 1 . Si ninguno -t ni -b está en efecto, los caracteres de un campo se cuentan desde el principio del espacio en blanco anterior. OPCIONES es una o más opciones de pedido de una sola letra, que anulan las opciones de pedido global para esa clave. Si no se proporciona ninguna clave, utilice toda la línea como clave.

TALLA puede ir seguido de los siguientes sufijos multiplicativos:

% 1% de memoria
b 1
A 1024 (predeterminado)

... y así sucesivamente para METRO , GRAMO , T , PAG , ES , CON , Y .

Sin EXPEDIENTE , o cuando EXPEDIENTE es un guión (' - '), clasificar lee del entrada estándar .

Además, tenga en cuenta que la configuración regional especificada por el ambiente afecta el orden de clasificación; colocar LC_ALL = C para obtener el orden de clasificación tradicional que utiliza valores de bytes nativos.

Ejemplos de

Digamos que tienes un archivo data.txt , que contiene lo siguiente ASCII texto:

|_+_|

Para ordenar las líneas en este archivo alfabéticamente, use el siguiente comando:

|_+_|

... que producirá el siguiente resultado:

|_+_|

Tenga en cuenta que este comando en realidad no cambia el archivo de entrada, data.txt . Si desea escribir la salida en un archivo nuevo, output.txt , redirigir la salida de esta manera:

|_+_|

... que no mostrará ningún resultado, pero creará el archivo output.txt con los mismos datos ordenados del comando anterior. Para comprobar la salida, utilice el gato mando:

|_+_|

... que muestra los datos ordenados:

|_+_|

También puede utilizar el integrado clasificar opción -o , que le permite especificar un archivo de salida:

|_+_|

Utilizando la -o La opción es funcionalmente lo mismo que redirigir la salida a un archivo; ninguno tiene ventaja sobre el otro.

Clasificación en orden inverso

Puede realizar una ordenación en orden inverso utilizando el -r bandera. Por ejemplo, el siguiente comando:

|_+_|

... producirá la siguiente salida:

|_+_|

Manejo de datos de casos mixtos

Pero, ¿qué pasa con las situaciones en las que tiene una combinación de letras mayúsculas y minúsculas al comienzo de sus líneas? En casos como este, el comportamiento de clasificar puede parecer confuso, pero en realidad solo necesita un poco más de información para ordenar los datos de la manera que desee. Miremos más de cerca.

Digamos nuestro archivo de entrada data.txt contiene los siguientes datos:

|_+_|

clasificar ing estos datos sin ninguna opción, como esta:

|_+_|

... producirá la siguiente salida:

|_+_|

Como puede ver, está ordenado alfabéticamente, y las letras minúsculas siempre aparecen antes de las mayúsculas. Este tipo no distingue entre mayúsculas y minúsculas, y es el predeterminado para GNU clasificar , que es la versión de clasificar utilizado en GNU / Linux.

En este punto, es posible que se esté preguntando, bueno, si la ordenación que no distingue entre mayúsculas y minúsculas es la predeterminada, entonces ¿cuál es el ' -F / --ignorar caso 'opción para? La respuesta tiene que ver con la configuración de localización y la ordenación por bytes.

En resumen, 'localización' se refiere al idioma que usa el sistema operativo, que en el nivel más básico define qué caracteres usa. Cada letra del sistema se representa en un orden determinado. El cambio de la configuración regional afectará a los caracteres que utiliza el sistema operativo y, lo que es más importante para la clasificación, en qué orden están codificados. Para obtener un ejemplo, consulte el inglés de Estados Unidos. Tabla de codificación ASCII . Como puede ver en la tabla, una A mayúscula (' A ') es el carácter número 65 y una minúscula (' a ') es el carácter número 97. Así que es de esperar clasificar para organizar su salida de modo que las letras mayúsculas vayan antes que las minúsculas.

La definición de la configuración regional del sistema operativo es un tema que va más allá del alcance de esta página, pero por ahora, será suficiente decir que para lograr la ordenación por bytes, necesitamos establecer el Variable ambiental LC_ALL a C .

Bajo el shell predeterminado de Linux, intento , podemos lograr esto con el siguiente comando:

|_+_|

Esto establece la variable de entorno LC_ALL al valor C , que aplicará la ordenación por bytes. Ahora si ejecutamos el comando:

|_+_|

... veremos el siguiente resultado:

|_+_|

...y ahora , la -F / --ignorar caso La opción tiene el siguiente efecto:

|_+_|

... realizando una ordenación 'bytewise insensible a mayúsculas y minúsculas'.

Nota

si está utilizando el entrar comando junto con clasificar , tenga en cuenta que existe una incompatibilidad conocida entre los dos programas, a menos que defina la configuración regional. Si esta usando entrar y clasificar para procesar la misma entrada, se recomienda encarecidamente que establezca LC_ALL a C , que estandarizará la localización utilizada por todos los programas.

Comprobación del orden ordenado

Si solo desea verificar si su archivo de entrada ya está ordenado, use el -c opción:

|_+_|

Si sus datos no están clasificados, recibirá un mensaje informativo que informa el número de línea de los primeros datos sin clasificar y cuáles son los datos sin clasificar:

|_+_|

Ordenar varios archivos usando la salida de buscar

Una forma útil de ordenar los datos es ordenar la entrada de varios archivos, utilizando la salida de la encontrar mando. La forma más confiable (y responsable) de lograr esto es especificar que encontrar produce una lista de archivos terminada en NUL como su salida, y para canalizar esa salida a clasificar utilizando la --files0-from opción.

Normalmente, encontrar genera un archivo en cada línea; en otras palabras, inserta un salto de línea después de cada nombre de archivo que genera. Por ejemplo, digamos que tenemos tres archivos llamados data1.txt , data2.txt , y data3.txt . encontrar puede generar una lista de estos archivos usando el siguiente comando:

|_+_|

Este comando usa el signo de interrogación comodín para hacer coincidir cualquier archivo que tenga un solo carácter después de la palabra 'datos' en su nombre, terminando en la extensión ' .TXT '. Produce la siguiente salida:

|_+_|

Sería bueno si pudiéramos usar esta salida para decirle al clasificar comando, 'ordenar los datos en cualquier archivo encontrado por encontrar como si todos fueran un gran archivo. El problema con el estándar encontrar El resultado es, aunque es fácil de leer para los humanos, puede causar problemas a otros programas que necesitan leerlo. Debido a que los nombres de archivo pueden incluir caracteres no estándar, en algunos casos, este formato será leído incorrectamente por otro programa. .

La forma correcta de formatear encontrar La salida que se utilizará como lista de archivos para otro programa es utilizar la -print0 opción al correr encontrar . Esto termina cada nombre de archivo con el carácter NUL (número de carácter ASCII cero), que es universalmente ilegal para usar en nombres de archivos. Esto facilita que el programa lea la lista de archivos, ya que sabe que cada vez que ve el carácter NUL, puede estar seguro de que está al final de un nombre de archivo.

Entonces, si ejecutamos el comando anterior con el -print0 opción al final, así:

|_+_|

... producirá la siguiente salida:

|_+_|

No puede verlo, pero después de cada nombre de archivo hay un carácter NUL. Este carácter no es imprimible, por lo que no aparecerá en su pantalla, pero está allí, y cualquier programa al que canalice esta salida ( clasificar , por ejemplo) los verá.

Nota

Tenga cuidado con la forma en que redacta el encontrar mando. Es importante especificar -print0 último; encontrar necesita que esto se especifique después de las otras opciones.

Está bien, pero ¿cómo lo contamos? clasificar leer esta lista de archivos y ordenar el contenido de todos esos archivos?

Una forma de hacerlo es canalizar el encontrar salida a clasificar , especificando el --files0-from opción en el clasificar comando y especifique el archivo como un guión (' - '), que leerá de la entrada estándar. Así es como se verá el comando:

|_+_|

... y generará los datos ordenados de cualquier archivo ubicado por encontrar que coincide con el patrón datos? .txt , como si fueran todos un archivo . Este ejemplo es una función muy poderosa de clasificar - darle una oportunidad.

Comparar solo campos de datos seleccionados

Normalmente, clasificar decide cómo ordenar las líneas basándose en la línea completa: compara cada carácter desde el primer carácter de una línea hasta el último.

Si por el contrario quieres clasificar para comparar un subconjunto limitado de sus datos, puede especificar qué campos comparar utilizando el -a opción.

Por ejemplo, si tiene un archivo de entrada data.txt Con los siguientes datos:

|_+_|

... y lo ordena sin opciones, así:

|_+_|

... recibirá el siguiente resultado:

|_+_|

... como puede ver, no se cambió nada con respecto al orden de datos original, debido a los números al principio de la línea, que ya estaban ordenados. Sin embargo, si desea ordenar según los nombres, puede usar el siguiente comando:

|_+_|

Este comando ordenará el segundo e ignore el primero. (El Kin ' -a 'significa' clave ': estamos definiendo la' clave de clasificación 'utilizada en la comparación).

Los campos se definen como cualquier cosa separada por espacio en blanco ; en este caso, un carácter de espacio real. Nuestro comando anterior producirá el siguiente resultado:

|_+_|

... que está ordenado por el segundo campo, enumerando las líneas alfabéticamente por nombre e ignorando los números en el proceso de clasificación.

También puede especificar una más compleja -a opción. El argumento posicional completo se ve así:

|_+_|

...dónde POS1 es la posición del campo inicial, y POS2 es la posición del campo final. Cada puesto de campo, a su vez, se define como:

|_+_|

...dónde F es el número de campo y C es el carácter dentro de ese campo para comenzar la comparación de clasificación.

Entonces, digamos nuestro archivo de entrada data.txt contiene los siguientes datos:

|_+_|

... podemos ordenar por antigüedad si especificamos el tercer campo como clave de ordenación:

|_+_|

... esto produce la siguiente salida:

|_+_|

O podemos ignorar los primeros tres caracteres del tercer campo y ordenar únicamente según el título, ignorando la antigüedad:

|_+_| |_+_|

También podemos especificar en qué lugar de la línea detener comparando. Si ordenamos basándonos en solo los caracteres del tercero al quinto del tercer campo de cada línea, así:

|_+_|

... clasificar veremos solo lo mismo en cada línea: ' .De ' ... y nada más . Como resultado, clasificar no verá ninguna diferencia en las líneas, y la salida ordenada será la misma que la del archivo original:

|_+_|

Usar ordenar y unir juntos

clasificar puede ser especialmente útil cuando se utiliza junto con el entrar mando. Normalmente entrar unirá las líneas de dos archivos cualesquiera cuyo primer campo coincida. Digamos que tienes dos archivos file1.txt y file2.txt . file1.txt contiene el siguiente texto:

|_+_|

...y file2.txt contiene lo siguiente:

|_+_|

Si te gustaria clasificar estos dos archivos y entrar ellos, puede hacerlo todo en un comando si está utilizando el intento shell de comandos, así:

|_+_|

Aquí el clasificar Los comandos entre paréntesis se ejecutan y su salida se redirige a entrar , que toma su salida como entrada estándar para su primer y segundo argumento; está uniendo el contenido ordenado de ambos archivos y da resultados similares a los siguientes.

|_+_|

com - Compare dos archivos ordenados línea por línea.
entrar - Une las líneas de dos archivos que comparten un campo de datos común.
uniq - Identificar y, opcionalmente, filtrar, líneas repetidas en un archivo.