GNU/Linux >> Tutoriales Linux >  >> Linux

Ordenarse con ordenar en la línea de comando

Si alguna vez usó una aplicación de hoja de cálculo, entonces sabe que las filas se pueden ordenar por el contenido de una columna. Por ejemplo, si tiene una lista de gastos, es posible que desee ordenarlos por fecha, por precio ascendente o por categoría, etc. Si se siente cómodo usando una terminal, es posible que no quiera tener que usar una aplicación de oficina grande solo para ordenar datos de texto. Y eso es exactamente lo que el tipo el comando es para.

Instalando

Más recursos de Linux

  • Hoja de trucos de los comandos de Linux
  • Hoja de trucos de comandos avanzados de Linux
  • Curso en línea gratuito:Descripción general técnica de RHEL
  • Hoja de trucos de red de Linux
  • Hoja de trucos de SELinux
  • Hoja de trucos de los comandos comunes de Linux
  • ¿Qué son los contenedores de Linux?
  • Nuestros últimos artículos sobre Linux

No necesitas instalar sort porque está invariablemente incluido en cualquier sistema POSIX. En la mayoría de los sistemas Linux, el ordenar El comando se incluye en una colección de utilidades de la organización GNU. En otros sistemas POSIX, como BSD y Mac, el ordenar predeterminado El comando no es de GNU, por lo que algunas opciones pueden diferir. Intentaré dar cuenta de las implementaciones de GNU y BSD en este artículo.

Ordenar líneas alfabéticamente

El ordenar El comando, de forma predeterminada, mira el primer carácter de cada línea de un archivo y genera cada línea en orden alfabético ascendente. En el caso de que dos caracteres en varias líneas sean iguales, considera el siguiente carácter. Por ejemplo:

$ cat distro.list
Slackware
Fedora
Red Hat Enterprise Linux
Ubuntu
Arch
1337
Mint
Mageia
Debian
$ sort distro.list
1337
Arch
Debian
Fedora
Mageia
Mint
Red Hat Enterprise Linux
Slackware
Ubuntu

Usar ordenar no cambia el archivo original. Ordenar es un filtro, por lo que si desea conservar sus datos en su forma ordenada, debe redirigir la salida mediante > o camiseta :

$ sort distro.list | tee distro.sorted
1337
Arch
Debian
[...]
$ cat distro.sorted
1337
Arch
Debian
[...]

Ordenar por columna

Los conjuntos de datos complejos a veces necesitan ordenarse por algo que no sea la primera letra de cada línea. Imagine, por ejemplo, una lista de animales y la especie y género de cada uno, y cada "campo" (una "celda" en una hoja de cálculo) está definido por un carácter delimitador predecible. Este es un formato de datos tan común para las exportaciones de hojas de cálculo que la extensión de archivo CSV (valores separados por comas) existe para identificar dichos archivos (aunque un archivo CSV no tiene que estar separado por comas, ni un archivo delimitado tiene que usar el extensión CSV para que sea válida y utilizable). Considere este conjunto de datos de ejemplo:

Aptenodytes;forsteri;Miller,JF;1778;Emperor
Pygoscelis;papua;Wagler;1832;Gentoo
Eudyptula;minor;Bonaparte;1867;Little Blue
Spheniscus;demersus;Brisson;1760;African
Megadyptes;antipodes;Milne-Edwards;1880;Yellow-eyed
Eudyptes;chrysocome;Viellot;1816;Southern Rockhopper
Torvaldis;linux;Ewing,L;1996;Tux

Dado este conjunto de datos de muestra, puede usar el --field-separator (utilice -t en BSD y Mac, o en GNU para reducir la escritura) para establecer el carácter delimitador en un punto y coma (porque este ejemplo usa punto y coma en lugar de comas, pero podría usar cualquier carácter), y use la tecla -- (-k en BSD y Mac o en GNU para reducir la escritura) para definir por qué campo ordenar. Por ejemplo, para ordenar por el segundo campo (empezando por 1, no por 0) de cada línea:

sort --field-separator=";" --key=2
Megadyptes;antipodes;Milne-Edwards;1880;Yellow-eyed
Eudyptes;chrysocome;Viellot;1816;Sothern Rockhopper
Spheniscus;demersus;Brisson;1760;African
Aptenodytes;forsteri;Miller,JF;1778;Emperor
Torvaldis;linux;Ewing,L;1996;Tux
Eudyptula;minor;Bonaparte;1867;Little Blue
Pygoscelis;papua;Wagler;1832;Gentoo

Eso es algo difícil de leer, pero Unix es famoso por su tubería método de construcción de comandos, por lo que puede usar la columna comando para "embellecer" la salida. Uso de la columna de GNU :

$ sort --field-separator=";" \
--key=2 penguins.list | \
column --table --separator ";"
Megadyptes   antipodes   Milne-Edwards  1880  Yellow-eyed
Eudyptes     chrysocome  Viellot        1816  Southern Rockhopper
Spheniscus   demersus    Brisson        1760  African
Aptenodytes  forsteri    Miller,JF      1778  Emperor
Torvaldis    linux       Ewing,L        1996  Tux
Eudyptula    minor       Bonaparte      1867  Little Blue
Pygoscelis   papua       Wagler         1832  Gentoo

Ligeramente más crípticas para el nuevo usuario (pero más cortas para escribir), las opciones de comando en BSD y Mac:

$ sort -t ";" \
-k2 penguins.list | column -t -s ";"
Megadyptes   antipodes   Milne-Edwards  1880  Yellow-eyed
Eudyptes     chrysocome  Viellot        1816  Southern Rockhopper
Spheniscus   demersus    Brisson        1760  African
Aptenodytes  forsteri    Miller,JF      1778  Emperor
Torvaldis    linux       Ewing,L        1996  Tux
Eudyptula    minor       Bonaparte      1867  Little Blue
Pygoscelis   papua       Wagler         1832  Gentoo

La clave la definición no tiene que establecerse en 2 , por supuesto. Cualquier campo existente se puede utilizar como clave de clasificación.

Orden inverso

Puede invertir el orden de una lista ordenada con --reverse (-r en BSD o Mac o GNU para abreviar):

$ sort --reverse alphabet.list
z
y
x
w
[...]

Puede lograr el mismo resultado canalizando la salida de una ordenación normal a través de tac.

Ordenar por mes (solo GNU)

En un mundo perfecto, todo el mundo escribiría fechas según la norma ISO 8601:año, mes, día. Es un método lógico para especificar una fecha única y es fácil de entender para las computadoras. Y, sin embargo, con bastante frecuencia, los humanos usan otros medios para identificar fechas, incluidos meses con nombres bastante arbitrarios.

Afortunadamente, el ordenador de GNU el comando da cuenta de esto y puede ordenar correctamente por nombre de mes. Usa el --month-sort (-M ) opción:

$ cat month.list
November
October
September
April
[...]
$ sort --month-sort month.list
January
February
March
April
May
[...]
November
December

Los meses se pueden identificar por su nombre completo o por una parte de sus nombres.

Ordenación numérica legible por humanos (solo GNU)

Otro punto común de confusión entre humanos y computadoras son los grupos de números. Por ejemplo, los humanos a menudo escriben "1024 kilobytes" como "1 KB" porque es más fácil y rápido para el cerebro humano analizar "1 KB" que "1024" (y se vuelve más fácil cuanto mayor es el número). Sin embargo, para una computadora, una cadena como 9 KB es más grande que, por ejemplo, 1 MB (aunque 9 KB es solo una fracción de un megabyte). La clasificación de GNU comando proporciona el --human-numeric-sort (-h ) para ayudar a analizar estos valores correctamente.

$ cat sizes.list
2M
12MB
1k
9k
900
7000
$ sort --human-numeric-sort
900
7000
1k
9k
2M
12MB

Hay algunas inconsistencias. Por ejemplo, 16 000 bytes es mayor que 1 KB, pero ordenar no reconoce que:

$ cat sizes0.list
2M
12MB
16000
1k
$ sort -h sizes0.list
16000
1k
2M
12MB

Lógicamente, 16 000 debería escribirse 16 KB en este contexto, por lo que GNU sort no tiene toda la culpa. Siempre que esté seguro de que sus números son consistentes, el --human-numeric-sort puede ayudar a analizar números legibles por humanos de una manera amigable con la computadora.

Ordenación aleatoria (solo GNU)

A veces, las utilidades brindan la opción de hacer lo contrario de lo que deben hacer. En cierto modo, no tiene sentido para un tipo comando para tener la capacidad de "ordenar" un archivo aleatoriamente. Por otra parte, el flujo de trabajo del comando lo convierte en una característica conveniente. podrías use un comando diferente, como shuf , o simplemente puede agregar una opción al comando que está usando. Ya sea que se trate de un diseño de experiencia de usuario exagerado o ingenioso, la clasificación de GNU El comando proporciona los medios para ordenar un archivo arbitrariamente.

La forma más pura de clasificación arbitraria es --random-sort o -R opción (que no debe confundirse con -r opción, que es la abreviatura de --reverse ).

$ sort --random-sort alphabet.list
d
m
p
a
[...]

Puede ejecutar una ordenación aleatoria varias veces en un archivo para obtener resultados diferentes cada vez.

Ordenado

Hay muchas más funciones disponibles con ordenar Comandos GNU y BSD, así que dedique algún tiempo a conocer las opciones. Te sorprenderá lo flexible que es ordenar puede ser, especialmente cuando se combina con otras utilidades de Unix.


Linux
  1. Trabajar con flujos de datos en la línea de comandos de Linux

  2. Haga más en la línea de comandos de Linux con GNU Parallel

  3. Trabajando con tuberías en la línea de comando de Linux

  4. ¿Cómo obtener un recuento de archivos en un directorio usando la línea de comando?

  5. Obtener el complemento del resultado de un comando Ls?

Comando de clasificación de Linux con ejemplos

Conozca su Sistema (usando la línea de comando)

Domina la línea de comandos de Linux

Manipulación de texto en la línea de comando con grep

Seguimiento del tiempo con Timewarrior en la línea de comandos

Cómo controlar versiones con Git en la línea de comando