Cómo utilizar el comando de orden de clasificación
Cómo utilizar el comando ordenar
1 Cómo funciona la clasificación
Ordenar trata cada línea del archivo como una unidad y las compara entre sí. El principio de comparación es comparar hacia atrás comenzando desde el primer carácter, luego comparar de acuerdo con el valor del código ASCII y finalmente generar en orden ascendente.
[rocrocket@rocrocket programación]$ cat seq.txt
Plátano
Manzana
Peral
Naranja
[rocrocket@rocrocket programación]$ sort seq.txt
Apple
Banana
Naranja
Pear Tree
-opción de clasificación -u 2
Su función es muy simple, es decir, eliminar filas duplicadas en las filas de salida.
[rocrocket@rocrocket programación]$ cat seq.txt
Plátano
Manzana
Peral
Naranja
Pal
[rocrocket@rocrocket programming]$ sort seq.txt
Apple
Banana
Naranja
Pal
Pal
[rocrocket@rocrocket programación]$ sort -u seq.txt
Apple p>
Plátano
Naranja
Pera
Debido a la duplicación, Pear fue eliminado sin piedad por la opción -u.
3 Opción Ordenar -r
El método de clasificación predeterminado es el orden ascendente. Si desea cambiarlo a orden descendente, simplemente agregue -r para obtenerlo.
[rocrocket@programación rocrocket]$ número de gato.txt
1
Tres
Cinco
2
Cuatro
[rocrocket@programación rocrocket]$ sort number.txt
1
2
Tres
Cuatro
Cinco
[rocrocket@programación rocrocket]$ sort -r number.txt
Cinco
Cuatro
Tres
2
1
-o 4 opciones
Porque de forma predeterminada ordenar genera el resultados a la salida estándar, por lo que requiere una redirección para escribir los resultados en un archivo, como ordenar nombre de archivo > archivo nuevo.
Sin embargo, si desea enviar los resultados ordenados al archivo original, no puede utilizar la redirección.
[rocrocket@programación rocrocket]$ sort-r número .txt & gt; número.txt
[rocrocket@programación rocrocket]$ cat número.txt
[rocrocket@rocrocket programming]$
Mira, el número ha sido borrado.
Aquí es cuando aparece la opción -o, que resuelve con éxito este problema y le permite escribir de forma segura los resultados en el archivo original. Esta es probablemente la única ventaja que tiene -o sobre la redirección.
[rocrocket@programación rocrocket]$ número de gato.txt
1
Tres
Cinco
2
Cuatro
[rocrocket@programación rocrocket]$ sort -r número.txt -o número.txt
[rocrocket@programación rocrocket]$ número de gato. txt
Cinco
Cuatro
Tres
2
1
5 ordenar La opción -n
¿Alguna vez te has encontrado con una situación en la que 10 es menor que 2? De todos modos, lo conocí. Esto sucede porque el programa de clasificación clasifica estos números carácter por carácter. El programa de clasificación primero compara 1 con 2. Obviamente, 1 es pequeño, por lo que antepone 10 a 2. Este es también el estilo de clasificación consistente.
Si queremos cambiar esta situación, deberíamos usar la opción -n para indicar sort,? ¿Quieres ordenar por valor? !
[rocrocket@programación de rocrocket]$ número de gato.txt
1
10
19
11
2
五
[rocrocket@programación rocrocket]$ ordenar número.txt
1
10
11
19
2
五
[rocrocket@programación rocrocket]$ ordenar -n número .txt
1
2
五
10
11
19
6 opciones -t ordenadas y opción -k
Si existe tal archivo:
[programación rocrocket@rocrocket]$ cat facebook.txt p>
Plátano: 30:5.5
Manzana: 10:2.5
Pera: 90:2.3
Naranja: 20:3.4
El archivo tiene tres columnas, separadas por dos puntos. La primera columna representa el tipo de fruta, la segunda columna representa la cantidad de fruta y la tercera columna representa el precio de la fruta.
Luego quiero ordenar por el número de frutas, es decir, por la segunda columna. ¿Cómo utilizar la clasificación?
Afortunadamente, sort proporciona la opción -t y puedes configurar el separador más adelante. (¿Has pensado en la opción -d de cortar y pegar? * * *Ming~ ~)
Después de especificar el separador, puedes usar -k para especificar el número de columnas.
[rocrocket@programación rocrocket]$ sort -n -k 2 -t : facebook.txt
Apple: 10:2.5
Naranja: 20:3.4
Plátano: 30:5.5
Pera: 90:2.3
Usamos dos puntos como separador y ordenamos los valores de la segunda columna en orden ascendente El resultado Muy satisfactorio.
7 Otras opciones de clasificación comunes
-f convierte todas las letras minúsculas en mayúsculas para compararlas, es decir, ignorando mayúsculas y minúsculas.
-c comprobará si el archivo está en orden. Si ocurre un error, imprimirá información sobre la primera línea de error y eventualmente devolverá 1.
-C comprobará si el archivo está en orden. Si el orden es incorrecto, no se generará ningún contenido, solo se devolverá 1.
-M ordenará por mes, por ejemplo, enero es menor que febrero, y así sucesivamente.
-b Ignora todos los espacios antes de cada línea y comienza la comparación desde el primer carácter visible.
A veces, cuando estudias un script, encontrarás que el comando de clasificación va seguido de un montón de cosas como -k1, 2 o -k1.2 -k3.4, lo cual es un poco extraño.
Hoy vamos a arreglarlo, ¿vale? -k opción!
1 Materiales de preparación
$ cat facebook.txt
Google 110 5000
Baidu 100
Canciones antiguas 50 3000
Sohu 100 4500
El primer campo es el nombre de la empresa, el segundo campo es el número de empresas y el tercer campo es el salario promedio de los empleados. (Excepto el nombre de la empresa, todas las demás letras están garabateadas_)
Quiero que este archivo esté ordenado alfabéticamente por empresa, es decir, por el primer campo: (Este archivo facebook.txt tiene tres campos)
$ sort -t -k 1 facebook.txt
Baidu 100
Google 110 5000
古歌50 3000
Sohu 100 4500
Mira, solo usa -k 1 para configurarlo. (En realidad, esto no es estricto, lo sabrás más adelante).
Quiero que facebook.txt esté ordenado por número de empresas.
$ sort -n -t -k 2 facebook.txt
古歌50 3000
Baidu 100
Sohu 100 4500
Google 110 5000
No hace falta decir que creo que lo entenderás.
Pero aquí hay un problema, es decir, el número de empresas en Baidu y Sohu es el mismo, 100. ¿Qué debemos hacer en este momento? De forma predeterminada, ordena en orden ascendente comenzando desde el primer campo, por lo que Baidu se ubica antes que Sohu.
4 Espero que facebook.txt se ordene por el número de personas en la empresa, y el mismo número de personas se ordene por el salario promedio de los empleados en orden ascendente:
$ sort -n -t -k 2 -k 3 facebook.txt
Guge 50 3000
Sohu 100 4500
Baidu 100
Google 110 5000
Mira, pasamos. Agregar un -k2 -k3 resolvió el problema. Sí, la clasificación admite esta configuración, que consiste en establecer la prioridad de clasificación de dominios primero por el segundo dominio y, si son iguales, por el tercer dominio. (Si lo desea, puede continuar escribiendo así y establecer muchas prioridades de clasificación).
5 Quiero que facebook.txt se ordene por el salario del empleado en orden descendente, y si el número de empleados es el Lo mismo, se ordenará por número de empresa en orden ascendente Ordenar: (esto es un poco difícil)
$ sort -n -t -k 3r -k 2 facebook.txt
Baidu 100
Google 110 5000
p>Sohu 100 4500
Guge 50 3000
Aquí se utilizan algunas técnicas. Mire con atención, se agrega en secreto una letra R minúscula después de -k 3. Piénselo, combinado con nuestro artículo anterior, ¿puede obtener la respuesta? Revelar: las opciones R y -r tienen la misma función, es decir, representan el orden inverso. Debido a que ordenar ordena de forma predeterminada en orden ascendente, es necesario agregar R aquí para indicar que el tercer campo (salario promedio de los empleados) está ordenado en orden descendente. También puede agregar n aquí, lo que significa que al ordenar este campo debe ordenar según el tamaño de los valores. Por ejemplo:
$ sort -t -k 3nr -k 2n facebook.txt
Baidu 100
Google 110 5000
Sohu 100 4500
古歌50 3000
Mira, eliminamos la opción -n anterior y la agregamos a cada opción -k.
6 Formato de sintaxis específico para la opción -k
Si quieres ir más allá, debes tener algunos conocimientos teóricos. Necesita conocer el formato de sintaxis de la opción -k, como sigue:
[FStart[. CStart]][Modificador][, [FEnd[.
CEnd]][Modifier]]
Este formato gramatical se puede dividir en dos partes con comas (?,?), la parte inicial y la parte final.
Primero déjame inculcarte una idea, ¿no? Si la parte final no está configurada, ¿se considera que Fin está configurado al final de la línea? . Este concepto es muy importante, pero muchas veces no le prestas atención.
La parte inicial también se compone de tres partes, entre las cuales la parte modificadora es la parte de opción similar a la N y R que mencionamos antes. Centrémonos en el inicio de f y el inicio de C.
C.Start también se puede omitir, lo que significa comenzar desde el principio del campo. -k 2 y -k 3 en el ejemplo anterior son ejemplos de omisión de C.Start
FStart. CStart, donde FStart representa el dominio utilizado y CStart representa qué carácter en el dominio f start comienza a contar. ¿Ordenar por primer carácter? .
De manera similar, en la sección Fin, se puede configurar FEnd.CEnd si se omite. CEnd, ¿significa que se acabó? ¿Cola de dominio? Es decir, el último personaje del campo. Alternativamente, si CEnd se establece en 0 (cero), ¿también significa finalizar en? ¿Cola de dominio? .
7 Si lo desea, ordene desde la segunda letra del nombre en inglés de la empresa:
$ sort -t -k 1.2 facebook.txt
Baidu 100
p>
Sohu 100 4500
Google 110 5000
Guge 50 3000
Mira, usamos -k 1.2, que significa que desde Ordena cadenas desde el segundo carácter de un campo hasta el último carácter del campo. Descubrirá que Baidu ocupa el primer lugar porque la segunda letra es a. Los segundos caracteres de Sohu y Google son ambos O, pero la H de Sohu viene antes que la O de Google, por lo que ocupan el segundo y tercer lugar respectivamente. Guge sólo puede ocupar el cuarto lugar.
8 Pensé en ordenar solo la segunda letra del nombre en inglés de la empresa, si la misma letra se ordena en orden descendente según el salario del empleado:
$ sort -t -k 1.2, 1.2 -k 3, 3nr facebook.txt
Baidu 100
Google 110 5000
Sohu 100 4500
Guge 50 3000
Dado que solo se ordena la segunda letra, usamos la expresión -K1.2 y 1.2 para representar nuestra? ¿solo? Ordenar por segunda letra. (Si preguntas, ¿por qué no puedo usar -k 1.2? Por supuesto que no, ya que estás omitiendo la parte final, lo que significa que ordenarás la cadena desde la segunda letra del campo hasta el último carácter. También usamos - k 3,3 clasifica el salario del empleado, ¿cuál es la forma más precisa de decir que solo clasificamos este campo porque si omitimos los 3 a continuación, los campos se clasifican en la última posición del campo?
¿Qué otras opciones hay para el modificador 9?
Puedes usar b, d, f, I, n o r.
Debes estar familiarizado con n y r. .
b significa ignorar el signo en el campo.
d significa ingresar el campo en orden de diccionario (es decir, solo se consideran espacios y letras
).F significa que no se consideran mayúsculas y minúsculas al ordenar este campo.
Me refiero solo a caracteres no imprimibles. Imprimir caracteres para ordenar (algunos caracteres ASCII no se pueden imprimir, como \a para alarma. , \b para retroceso, \n para avance de línea, \r para retorno de carro, etc.)
10 Pensamientos -k Ejemplo de uso combinado con -u;
$ cat facebook .txt
Google 110 5000
Baidu 100
古歌50 3000
Sohu 100 4500
Esto es el archivo facebook.txt original.
$ sort -n -k 2 facebook.txt
古歌50 3000
Baidu 100
Sohu 100 4500
Google 110 5000
$ sort -n -k 2 -u facebook.txt
Guge 50 3000
Baidu 100
Google 110 5000
Cuando configura el campo de empleado de la empresa para ordenar los valores y luego agrega -u, ¡la fila de Sohu se eliminará! Resulta que -u solo reconoce los campos configurados con -k, y si se encuentra que son idénticos, eliminará todas las líneas idénticas posteriores.
$ sort -k 1 -u facebook.txt
Baidu 100
Google 110 5000
古歌50 3000
Sohu 100 4500
$ sort-k 1.1.1.1-u Facebook txt
Baidu 100
Google 110 5000
<. p>Sohu 100 4500Lo mismo ocurre con este ejemplo. Las canciones antiguas cuya primera letra es G no son inmunes.
$ sort -n -k 2 -k 3 -u facebook.txt
古歌50 3000
Sohu 100 4500
Baidu 100
Google 110 5000
¡Oye! Al configurar aquí la prioridad de clasificación de dos niveles, usar -u no eliminará ninguna fila. Resulta que -u sopesará todas las opciones -k y solo se eliminarán las mismas, siempre que haya un nivel de diferencia, no se eliminarán fácilmente :) (Si no lo cree, puedes intentar agregar una línea de Sina 100 4500 tú mismo)
El tipo más extraño 11:
$ sort -n -k 2.2, 3.1 facebook.txt
Guge 50 3000
Baidu 100
Sohu 100 4500
Google 110 5000
Ordena las partes empezando por el segundo carácter del segundo campo al primer carácter del tercer campo Fin del carácter.
La primera línea extrae 0 3, la segunda línea extrae 00 5, la tercera línea extrae 00 4 y la cuarta línea extrae 10 5.
¿Y porque sort cree que 0 es menor que 00 y es menor que 000 y es menor que 0000? .
Entonces 0 3 debe estar en el primero. 10 5 debe estar en el último. Pero, ¿por qué 00 5 va delante de 00 4? Puedes hacer tus propios experimentos y pensar por ti mismo. )
La respuesta se revela: ¿Y entonces? ¿Es el establecimiento de dominios cruzados una ilusión? , la clasificación solo comparará el segundo carácter del segundo campo con el último carácter del segundo campo, sin incluir el primer carácter del tercer campo en el rango de comparación. Cuando se descubre que 00 y 00 son iguales, la clasificación comparará automáticamente el primer campo. Por supuesto, Baidu está por delante de Sohu. Un ejemplo puede confirmar esto:
$ sort -n -k 2.2, 3.1-k 1.1r Facebook.txt
古歌50 3000
Sohu 100 4500
Baidu 100
Google 110 5000
12 A veces verás los símbolos +1 -2 después del comando de clasificación. ¿Qué es esto?
Acerca de esta sintaxis, la última clasificación explica lo siguiente:
En el sistema antiguo, 'Ordenar? ¿Admite la sintaxis obsoleta de origen cero `+pos 1 [-pos 2]? Se utiliza para especificar claves de clasificación. POSIX 1003.1-2001 (*tenga en cuenta la conformidad con los estándares ::) no permite esto; de lo contrario.
Resulta que esta notación antigua ha sido eliminada, ¡y en el futuro podrás despreciar con razón las escrituras que utilicen esta notación!
Para prevenir la existencia de personajes antiguos, hablamos aquí de esta representación. Un signo más indica el comienzo y un signo menos indica el final.
Lo más importante es que este método comienza a contar desde 0, el primer campo mencionado anteriormente se representa aquí como el campo 0. El segundo carácter anterior se representa aquí como 1 carácter. )