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 | clasificarProducció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 -nProducción
9697
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 -hProducción
9697
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 -gProducción
9697
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 -gProducción
9697
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 -hProducción
9697
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-sortProducción
9596
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 <
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 aleatoriaProducción
maroct
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-sortProducción
enefeb
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.gitalias 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 ipsProducción
199.174.177.98180.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 ipsProducción
76.88.194.1578.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 igualorden 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.gzk-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 sorbosProducción
d-v127.100.108.192.alquitrán.gze-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 inicialesUso
sort --ignore-lead-blanksComandos
gente-famosa> fpgato >> 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> fpgato >> 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 | tacTenga 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 casoUso
sort --ignore-caseComandos
gente-famosa> fpgato >> 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> fpgato >> 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 | tacTenga 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 imprimirUso
sort --ignore-nonprintingComandos
gente-famosa> fpecho -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> fpecho -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> fpecho -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
--contrarrestarUso
sort --reverseLínea de comando
gente famosa | sort --reverseProducció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 | tacOtras 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
--chequeUso
ordenar --checkLínea de comando
seq 10 | sort --ordenar al azar | ordenar --checkProducción
ordenar: -: 3: desorden: 10Línea de comando
seq 10 | sort --ordenar al azar | ordenar | ordenar --checkProducció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 = ARCHIVOUso
sort --output = ARCHIVOLínea de comando
seq 10 | ordenar --ordenar al azar --salida = aleatorio-10Producció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 ceroUso
sort - terminado en ceroLínea de comando
seq 10 | tr '\ 012' '\ 000' | sort - terminada en cero - ordenación aleatoriaProducción
25346178910Ordenar 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
--estableUso
sort --estableLínea de comando
time seq 1000000 | sort --ordenar al azar | ordenar --estable> / dev / nullProducción
real 0m9.138usuario 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 = SIZEUso
sort --buffer-size = 64Línea de comando
time seq 1000000 | sort -random-sort | sort -stable -buffer-size = 64> / dev / null
Producción
real 0m21.685usuario 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
--únicoUso
sort --únicoLínea de comando echo 1 2 2 4 5 | tr '\ 040' '\ 000' | sort - terminada en cero --unique
Producción
1245Alternativas
ordenar | uniqConclusió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.