Comandos de Linux

Comando Bash sort

Comando Bash sort
Buena suerte al intentar implementar un algoritmo de ordenación en bash que termina antes de mañana. No se preocupe, no es necesario porque tiene el comando sort.

Con ordenar, puede ordenar archivos según el orden en el diccionario o por valor numérico, aleatorizar líneas de archivo, eliminar líneas duplicadas y verificar si un archivo está ordenado.

Es posible que pueda hacer otras cosas con él, pero primero, preocupémonos de entender cómo usar la ordenación en scripts de bash.

¿Qué es el género??

Ordenar es un comando externo que concatena archivos mientras ordena su contenido según un tipo de ordenación y escribe los resultados de la ordenación en la salida estándar.

Ordenar opciones de comando para bash

El comando de clasificación viene con 31 opciones (13 principales y 18 categorizadas como otras). La programación de bash más experimentada (incluso los expertos) conoce solo algunas de las principales opciones de clasificación necesarias para salir adelante. Otros rara vez se tocan. Por suerte para ti, tenemos tiempo para tocarlos a todos.

Opciones de clasificación principales

Estas son las opciones que le ayudan a hacer las cosas y ordenar (clasificación), además de manipular los resultados ordenados (procesamiento posterior) y aplicar filtros (filtros) antes de la clasificación.

Clasificación

Sort viene con 5 tipos diferentes de clasificación. Aquí hay una tabla que muestra cada tipo de clasificación con opciones asociadas.

Clasificar Opción corta / opción larga / etc
palabra
Orden numérico (general) -g / -orden-numérico-general
general-numérico
soporte para notación científica
0.1234e4 = 1234
Orden numérico (humano) -h / -human-numeric-sort
humano-numérico
1.234K = 1234
Numérico -n / -orden-numérico
numérico
.. < -1 < 0 < 1 <…
Mes -M / -més-ordenación
mes
Desconocido < Jan < Feb <… < Nov < Dec
Aleatorio -r / -ordenar al azar
aleatorio
Versión -V / -version-sort
versión

Tenga en cuenta que cada tipo de ordenación tiene una opción larga que termina en -sort. Además de las opciones de clasificación específicas, la opción -sort = WORD se puede utilizar para clasificar por palabra. Por ejemplo, se puede usar -sort = random en lugar de -random-sort o -r.

Ejemplos de

A continuación, se muestran algunos ejemplos de comandos de ordenación para cada método de ordenación.

Ejemplo) Clasificación de nombres

Ordenar no tiene problemas para ordenar las líneas alfabéticamente. Considere una lista de personajes famosos no ordenados.

Función

gente famosa()

curl - silencioso https: // www.biografía en línea.net / people / famous-100.html
| post-contenido de grep | sed -e 's /<[^>] *.// g '-e' s / Segunda Guerra Mundial // g '-e' s / \ (Wilbur \)
/ \ 1 Wright / '| grep -o -e '\ (\ ([A-Z] \ + [.] \?\) \ + [a-z] * \ s \) \ + ([0-9] \ + \ s [^)] \+.'

Línea de comando

gente famosa | clasificar

Producción

Stephen King (1947 -)
Steve Jobs (1955-2012)
Sting (1951 -)
Tiger Woods (1975 -)
Tom Cruise (1962 -)
Usain Bolt (1986 -)
Vinci (1452-1519)
Walt Disney (1901-1966)
Wilbur Wright (1867-1912)
Woodrow Wilson (1856-1924)

Ejemplo) Orden numérico general

Si necesitamos ordenar valores numéricos teniendo en cuenta la notación científica de hechos, como 99e2, podemos usar la ordenación numérica general.

Función

valores-numéricos-no-ordenados ()

seq 100 | sort --ordenar al azar | sed '3i 9e2' | sed '3i 99K'

Considere la salida ordenada usando cada método. Tenga en cuenta que, además de contener los valores del 1 al 100, la lista también incluye '9e12' (900) y '99K' (99000).

Línea de comando

valores-numéricos-no ordenados | sort -n

Producción

96
97
98
99
99 mil
100

¿Qué pasa con 900 y 99000?. Así es, es solo un tipo numérico. próximo.

Línea de comando

valores-numéricos-no-clasificados | sort -h

Producción

96
97
98
99
100
99 mil

¿Qué hay de 900. Así es, es solo un tipo numérico humano. próximo.

Línea de comando

valores-numéricos-no-clasificados | sort -g

Producción

96
97
98
99
99 mil
100
9e2

¿Qué pasa con 99000. Así es, es solo una clasificación numérica general. Como puede ver, ningún método de clasificación es compatible en este caso; sin embargo, eso no significa que no puedas encontrar una solución.

Línea de comando

valores-numéricos-no-clasificados | sed 's / [kK] / e3 /' | sort -g

Producción

96
97
98
99
100
9e2
99e3

Ahora eso es más como eso.

Ejemplo) Orden numérico humano

Si necesitamos ordenar valores numéricos teniendo en cuenta el significado de notaciones como K, G, M y E, podemos usar ordenamiento numérico humano.

Línea de comando

seq 100 | sort --ordenar al azar | sed '3i 3k' | sort -h

Producción

96
97
98
99
100
3k

Ejemplo) Orden numérico

Si todo lo que necesitamos es ordenar números enteros, la ordenación numérica funciona.

Línea de comando

seq 100 | sort --ordenar al azar | sort --numerics-sort

Producción

95
96
97
98
99
100

Ejemplo) Orden de mes

La clasificación por mes le permite ordenar las líneas por mes. Podría resultar útil para agrupar líneas por mes, especialmente en el caso de que la opción de ordenar por tiempo no esté disponible.

Función

meses ()

gato  <ene
feb
mar
abr
Mayo
jun
jul
ago
sep
oct
nov
dic
EOF

Supongamos que son meses no ordenados.

Línea de comando

meses | sort - ordenación aleatoria

Producción

mar
oct
dic
abr
Mayo
sep
ago
nov
jul
ene
feb
jun

Siempre podemos ordenar por mes.

Línea de comando

meses | sort --ordenar aleatorio | sort --month-sort

Producción

ene
feb
mar
abr
Mayo
jun
jul
ago
sep
oct
nov
dic

Tenga en cuenta que si cambiamos Dec a cualquier subcadena en noviembre, digamos 'Novem', aparecerá después de 'Nov' en la salida ordenada.

Ejemplo) Orden aleatorio: mata la terminal de otra persona

Como era de esperar, la ordenación aleatoria hace lo contrario de la ordenación, mezcla líneas.

Supongamos que por motivos educativos queremos matar a otro usuario. Tendríamos que asegurarnos de que no es nuestra opción y aleatorizar los listados para que sea más agradable y que podamos decir que las ptys se seleccionaron al azar.

Comandos

mensaje-pty ()


pty local;
pty = "$ 1"
;
echo -n "Vas a bajar en"> / dev / $ pty;
para i en 5 4 3 2 1;
hacer
dormir 1;
echo -n "$ i"> / dev / $ pty;
hecho;
echo "Adiós!"> / dev / $ pty;
dormir 1


ps | grep pty | grep -v -e $ (mypty) | sort --ordenar al azar | cabeza -1> stdin;

mensaje-pty $ (pty < stdin );
matar $ (pid < stdin )


Salida en la terminal de otra persona
Te vas a hundir en 5 4 3 2 1 Adiós!]
(Salida)

Ejemplo) Clasificación de versión: clasificación de ips

Como sabe, los archivos de origen se pueden versionar utilizando cadenas como 1.0. Además, las versiones pueden ser más profundas con números de versión como 1.0.0 como se ve en los esquemas de versiones semánticas populares.

La clasificación de versión le permite ordenar los números de versión. Estupendo! Ahora que? Vamos a probarlo.

Para este ejemplo, he preparado un script bash para generar ips aleatorios para que no tengamos que ir allí. Está en el repositorio. Para aquellos de nosotros que no tenemos el repositorio, aquí hay un comienzo rápido.

Comandos

clon de git https: // github.com / temptemp3 / linuxhint.com.git
alias random-ips = 'test -f "linuxhint.com / generate-random-ips.sh "; bash $ _ '

Ahora que estás listo, comencemos.

Línea de comando

random-ips 200 | tee ips

Producción

199.174.177.98
180.33.247.107
87.130.125.109
76.86.8.20
162.41.183.150
226.58.10.196
83.121.11.145
80.199.197.19
44.214.89.52
185.174.143.111

Está bien, funciona. Ahora veamos qué sucede cuando intentamos ordenar ips.

Línea de comando

ordenar ips

Producción

76.88.194.157
8.96.11.181
82.169.213.206
84.218.132.51
84.3.101.97
87.137.131.40
87.59.32.91
89.149.111.242
97.121.162.244
98.145.130.186

A primera vista, parece funcionar, pero líneas como 8.96.11.181 debería aparecer en otro lugar.

Comandos


para o in d h n V g M
hacer
ordenar ips - $ o> ips $ o ,,
hecho

hacer eco de todos los tipos de orden numérico igual
diff ips n, d 1> / dev / null || orden del diccionario de eco != orden numérico
diff ips n, h 1> / dev / null || echo tipo numérico humano != orden numérico
diff ips n, g 1> / dev / null || echo orden numérico general != orden numérico
diff ips n, v 1> / dev / null ||
Tipo de versión de eco != orden numérico
show_n_v_ips_diff = "verdadero"


prueba ! "$ show_n_v_ips_diff" || diff ips n, v

Producción

todo tipo de orden numérico igual
orden de diccionario != orden numérico
ordenación de la versión != orden numérico
13,14d12
< 44.221.43.20
< 44.27.108.172
15a14,15
> 44.27.108.172
> 44.221.43.20
27d26
< 84.218.132.51
29c28
< 87.137.131.40

Como ve, la clasificación de versiones le permite clasificar los números de versión cuando fallan otros métodos de clasificación.

Ejemplo) Clasificación de versión: clasificación de nombres de archivo con números de versión

Basándonos en el último ejemplo, usemos la ordenación de versiones un poco más cerca de su uso previsto. Como sabe, los números de versión suelen aparecer en los nombres de archivo. Ver detalles sobre la clasificación de versiones.

Primero, transformemos ips en algo más como un archivo fuente de proyecto como.

Comandos

alpha ()
alpha = "abcdefghijklmnopqrstuvwxyz";
echo -n $ alpha: $ ((RANDOM% 26)): 1

beta ()
alpha = "ab";
echo -n $ alpha: $ ((RANDOM% 2)): 1


ips de gato | while read -r línea; hacer
echo $ (alfa) -v $ línea $ (prueba $ ((RANDOM% 5)) -eq 0 || beta).alquitrán.gz;
hecho | sorbos de té

Producción

x-v56.dieciséis.109.54.alquitrán.gz
k-v117.38.14.165a.alquitrán.gz
d-v87.59.32.91a.alquitrán.gz
h-v115.215.64.100.alquitrán.gz
s-v72.174.246.218b.alquitrán.gz
h-v163.93.19.173.alquitrán.gz
u-v184.225.11.92b.alquitrán.gz
y-v205.53.5.211a.alquitrán.gz
t-v175.196.164.17b.alquitrán.gz
e-v167.42.221.178b.alquitrán.gz
c-v126.54.190.189b.alquitrán.gz
b-v169.180.221.131a.alquitrán.gz
y-v210.125.170.231a.alquitrán.gz
x-v71.56.120.9b.alquitrán.gz

Ejercicio

Haga que los comandos anteriores se ejecuten más rápido usando xargs

Vea el ejemplo de cómo usar el comando xargs en scripts bash.

Esta vez, ni siquiera nos molestaremos en usar ninguno de los otros métodos de clasificación.

Línea de comando

sort -V sorbos

Producción

d-v127.100.108.192.alquitrán.gz
e-v62.140.229.42a.alquitrán.gz
e-v149.77.211.215a.alquitrán.gz
e-v167.42.221.178b.alquitrán.gz
e-v194.189.236.29a.alquitrán.gz
e-v198.145.199.84b.alquitrán.gz
e-v240.1.147.196b.alquitrán.gz
f-v50.100.142.42b.alquitrán.gz
f-v117.58.230.116.alquitrán.gz
f-v139.17.210.68b.alquitrán.gz
f-v153.18.145.133b.alquitrán.gz
g-v201.153.203.60b.alquitrán.gz
g-v213.58.67.108.alquitrán.gz
h-v5.206.37.224.alquitrán.gz

Ahora ve que la clasificación de versiones puede ser útil al ordenar nombres de archivos con números de versión.

Pre ordenar

Ordenar tiene cuatro opciones principales que afectan la ordenación real, a saber, -ignorar-espacios en blanco iniciales, -ignorar-mayúsculas y minúsculas, -ignorar-no imprimir y -orden-diccionario, que pueden o no superponerse. Ejemplo de uso de cada opción a continuación.

Ordenar ignorando los espacios en blanco iniciales

Ordenar permite ignorar los espacios en blanco iniciales de entrada como una opción. Los espacios en blanco iniciales se conservan en la salida ordenada.

Opción

--ignorar los espacios en blanco iniciales

Uso

sort --ignore-lead-blanks

Comandos

gente-famosa> fp
gato >> fp << EOF
Marilyn Monroe (1926-1962)
Abraham Lincoln (1809-1865)
EOF
cat fp | ordenar | tac

Producción

Alfred Hitchcock (1899-1980)
Albert Einstein (1879-1955)
Al Gore (1948 -)
Abraham Lincoln (1809-1865)
Marilyn Monroe (1926-1962)
Abraham Lincoln (1809-1865)

Tenga en cuenta que los espacios iniciales en las líneas agregadas a fp aparecen primero en la salida de clasificación.

Para solucionar este problema, debemos ignorar los espacios en blanco iniciales de la siguiente manera.

Comandos

gente-famosa> fp
gato >> fp << EOF
Marilyn Monroe (1926-1962)
Abraham Lincoln (1809-1865)
EOF
cat fp | sort --ignore-lead-blanks --ignore-lead-blanks | tac

Producción

Marilyn Monroe (1926-1962)
Marilyn Monroe (1926-1962)
María Antonieta (1755-1793)
..
Albert Einstein (1879-1955)
Al Gore (1948 -)
Abraham Lincoln (1809-1865)
Abraham Lincoln (1809-1865)

Alternativas

cat fp | sed 's / ^ \ s * //' | ordenar | tac

Tenga en cuenta que la alternativa no conserva los espacios en blanco iniciales en la salida de clasificación.

Ordenar ignorando el caso

Ordenar permite ignorar el caso de entrada como una opción. El caso se conserva en la salida ordenada.

Opción

--ignorar caso

Uso

sort --ignore-case

Comandos

gente-famosa> fp
gato >> fp << EOF
Abraham Lincoln (1809-1865)
ABraham Lincoln (1809-1865)
EOF
cat fp | ordenar | tac

Producción

Amelia Earhart (1897-1937)
Alfred Hitchcock (1899-1980)
Albert Einstein (1879-1955)
Al Gore (1948 -)
Abraham Lincoln (1809-1865)
ABraham Lincoln (1809-1865)

Tenga en cuenta que los espacios iniciales en las líneas agregadas a fp aparecen primero en la salida de clasificación.

Para solucionar este problema, debemos ignorar los espacios en blanco iniciales de la siguiente manera.

Comandos

gente-famosa> fp
gato >> fp << EOF
Abraham Lincoln (1809-1865)
ABraham Lincoln (1809-1865)
EOF
cat fp | sort --ignore-case | tac

Producción

Amelia Earhart (1897-1937)
Alfred Hitchcock (1899-1980)
Albert Einstein (1879-1955)
Al Gore (1948 -)
Abraham Lincoln (1809-1865)
Abraham Lincoln (1809-1865)
ABraham Lincoln (1809-1865)

Alternativas

cat fp | while read -r línea; echo $ línea ,,; hecho | ordenar | tac

Tenga en cuenta que la alternativa no conserva el caso en la salida de clasificación.

Ordenar ignorando no imprimible

Ordenar permite ignorar la entrada no imprimible como una opción. La no impresión se conserva en la salida ordenada.

Opción

--ignorar-no imprimir

Uso

sort --ignore-nonprinting

Comandos

gente-famosa> fp
echo -e "\ x90Abe" >> fp
cat fp | ordenar | tac

Producción

Audrey Hepburn (1929-1993)
Angelina Jolie (1975 -)
Amelia Earhart (1897-1937)
Alfred Hitchcock (1899-1980)
Albert Einstein (1879-1955)
Al Gore (1948 -)
Abraham Lincoln (1809-1865)

Parece que nos falta un 'Abe' para los caracteres que no se imprimen en la entrada de clasificación.

Para solucionar este problema, debemos ignorar los caracteres que no se imprimen.

Comandos

gente-famosa> fp
echo -e "\ x90Abe" >> fp
cat fp | sort --ignore-nonprinting | tac
[/ cc \
Producción
[cc lang = "bash"]
Amelia Earhart (1897-1937)
Alfred Hitchcock (1899-1980)
Albert Einstein (1879-1955)
Al Gore (1948 -)
Abraham Lincoln (1809-1865)
▒Abe

Ordenar el orden del diccionario

Ordenar permite ignorar todas las entradas excepto los espacios y los caracteres alfanuméricos como una opción. La entrada se conserva en la salida ordenada.

gente-famosa> fp
echo -e "\ x90Abe" >> fp
cat fp | sort --d | tac

Orden de publicación

Ordenar tiene una opción principal que no afecta la ordenación, a saber, -reverse. Sin embargo, afecta la salida, lo que permite alternar el orden entre ascendente y descendente. A continuación se muestra un ejemplo.

Ordenar salida inversa

Ordenar permite que la salida se muestre en orden inverso como una opción.

Opción

--contrarrestar

Uso

sort --reverse

Línea de comando

gente famosa | sort --reverse

Producción

Angelina Jolie (1975 -)
Amelia Earhart (1897-1937)
Alfred Hitchcock (1899-1980)
Albert Einstein (1879-1955)
Al Gore (1948 -)
Abraham Lincoln (1809-1865)

Alternativas

ordenar | tac

Otras opciones para ordenar

Hay otras veintidós opciones para ordenar. Siguen ejemplos.

Ordenar cheque

Ordenar tiene una opción que le permite verificar si la entrada está ordenada. Vuelve después de la primera instancia de una línea sin clasificar. En el caso de que se requiera ordenar la entrada pero es probable que ya esté en orden, usar la verificación de clasificación es apropiado.

Opción

--cheque

Uso

ordenar --check

Línea de comando

seq 10 | sort --ordenar al azar | ordenar --check

Producción

ordenar: -: 3: desorden: 10

Línea de comando

seq 10 | sort --ordenar al azar | ordenar | ordenar --check

Producción

(blanco)

Ordenar salida

Ordenar tiene una opción que le permite especificar un archivo para escribir en lugar de usar la salida estándar o la redirección. Su uso puede mejorar la compatibilidad entre entornos de secuencias de comandos.

Opción

--salida = ARCHIVO

Uso

sort --output = ARCHIVO

Línea de comando

seq 10 | ordenar --ordenar al azar --salida = aleatorio-10

Producción

(blanco)

Ordenar nulo terminado

Ordenar tiene una opción que le permite establecer el delimitador de línea en nulo en lugar de una nueva línea.

Opción

--terminado en cero

Uso

sort - terminado en cero

Línea de comando

seq 10 | tr '\ 012' '\ 000' | sort - terminada en cero - ordenación aleatoria

Producción

25346178910

Ordenar estable

Ordenar tiene una opción que le permite deshabilitar la comparación de último recurso. Como resultado, se pueden lograr tiempos de ejecución más estables en el caso de entradas lo suficientemente grandes que podrían hacer que la clasificación se ejecute de manera inestable.

Opción

--estable

Uso

sort --estable

Línea de comando

time seq 1000000 | sort --ordenar al azar | ordenar --estable> / dev / null

Producción

real 0m9.138
usuario 0m9.201
sys 0m0.107 s

Ordenar tamaño de búfer

Ordenar tiene una opción que le permite establecer la cantidad de memoria utilizada como búfer mientras ordena. Se puede utilizar para limitar el consumo de memoria clasificando entradas más grandes. El rendimiento puede verse afectado.

Opción

--buffer-size = SIZE

Uso

sort --buffer-size = 64

Línea de comando

time seq 1000000 | sort -random-sort | sort -stable -buffer-size = 64> / dev / null

Producción

real 0m21.685
usuario 0m9.858
sys 0m2.092s

Ordenar único

Ordenar tiene una opción que le permite eliminar líneas duplicadas en la salida de clasificación

Opción

--único

Uso

sort --único

Línea de comando

echo 1 2 2 4 5 | tr '\ 040' '\ 000' | sort - terminada en cero --unique

Producción

1245

Alternativas

ordenar | uniq

Conclusión

Ordenar es un comando externo útil no solo cuando se usa en combinación con otros comandos externos, sino que también es útil cuando se usa con comandos sin un método de ordenamiento incorporado, como una función definida por el usuario o scripts bash en general.

El cursor salta o se mueve aleatoriamente mientras escribe en Windows 10
Si descubre que el cursor del mouse salta o se mueve por sí solo, automáticamente, de manera aleatoria mientras escribe en una computadora portátil o ...
Cómo invertir la dirección de desplazamiento del mouse y los paneles táctiles en Windows 10
Ratón y Panel táctils no solo facilitan la informática, sino que también hacen que sea más eficiente y requieran menos tiempo. No podemos imaginar una...
Cómo cambiar el tamaño, el color y el esquema del puntero del mouse y del cursor en Windows 10
El puntero y el cursor del mouse en Windows 10 son aspectos muy importantes del sistema operativo. Esto también se puede decir de otros sistemas opera...