Cómo utilizar el comando de clasificación
La función del comando ordenar es ordenar las líneas del archivo. El comando ordenar tiene muchas opciones muy prácticas, que originalmente se usaban para realizar diversas operaciones de clasificación del contenido de archivos en formato de base de datos. Sígueme para saber más.
Cómo utilizar el comando de clasificación
1 Cómo funciona la clasificación
La clasificación trata cada línea del archivo como una unidad y se compara entre sí. El principio de comparación. es desde el primer carácter hacia atrás, compare los valores del código ASCII en secuencia y finalmente envíelos en orden ascendente.
[rocrocket@rocrocket programación]$ cat seq.txt
plátano
manzana
pera
naranja
[rocrocket@rocrocket programación]$ sort seq.txt
manzana
plátano
naranja
pera
2 La opción -u de sort
Su función es muy simple, la cual es eliminar líneas duplicadas de las líneas de salida.
[rocrocket@rocrocket programación]$ cat seq.txt
plátano
manzana
pera
naranja
pera
[rocrocket@programación rocrocket]$ sort seq.txt
manzana
plátano
naranja
pera
pera
[rocrocket@rocrocket programación]$ sort -u seq.txt
manzana
plátano
naranja
pera
pera fue eliminado sin piedad por la opción -u debido a la duplicación.
3 La opción -r de ordenar
El método de clasificación predeterminado es orden ascendente. Si desea cambiarlo a orden descendente, simplemente agregue -r y estará hecho. .
[rocrocket@programación de rocrocket]$ número de gato.txt
1
3
5
2
4
[rocrocket@programación rocrocket]$ ordenar número.txt
1
2
3
4
5
[rocrocket@programación rocrocket]$ sort -r número.txt
5
4
3
2
1
4 opción -o de clasificación
Dado que la clasificación predeterminada es The Los resultados se envían a la salida estándar, por lo que se requiere la redirección para escribir los resultados en un archivo, en el formato ordenar nombre de archivo > nuevo archivo.
Sin embargo, si desea enviar los resultados de la clasificación al archivo original, la redirección no funcionará.
[rocrocket@programación rocrocket]$ sort -r número.txt > número.txt
[programación rocrocket@rocrocket]$ cat número.txt
[ rocrocket@rocrocket programming]$
Mira, el número ha sido borrado.
En ese momento, apareció la opción -o, que resolvió con éxito este problema y le permitió escribir los resultados en el archivo original con confianza. Esta es quizás la única ventaja de -o sobre la redirección.
[rocrocket@programación de rocrocket]$ número de gato.txt
1
3
5
2
4
[rocrocket@programación rocrocket]$ sort -r número.txt -o número.txt
[rocrocket@programación rocrocket]$ número de gato. txt
5
4
3
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? Lo he encontrado de todos modos. Esta situación ocurre porque el programa de clasificación clasifica estos números por caracteres. El programa de clasificación primero comparará 1 y 2. Obviamente, 1 es más pequeño, por lo que 10 se coloca delante de 2. Este es también el estilo de clasificación consistente.
Si queremos cambiar esta situación, necesitamos usar la opción -n para indicar a ordenar: "¡¿Quieres ordenar por valor numérico?!" $ número de gato .txt
1
10
19
11
2
5
[rocrocket@programación rocrocket]$ ordenar número.txt
1
10
11
19
2
5
[rocrocket@programación rocrocket]$ sort -n número.txt
1
2
5
10
11
19
6 opción -t de clasificación y -k Opciones
Si hay un archivo con contenido como este:
[rocrocket@rocrocket programación]$ cat facebook.txt
banana:30: 5.5
apple:10:2.5
pear:90:2.3
orange:20:3.4
Este archivo tiene tres columnas, entre 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.
Entonces quiero ordenar por la cantidad de frutas, es decir, ordenar por la segunda columna. ¿Cómo usar sort para lograr esto?
Afortunadamente, sort proporciona la opción -t. , que se puede configurar más tarde. (¿Recuerdas la opción -d de cortar y pegar? ***Hing~~)
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
orange:20:3.4
banana:30:5.5
pear:90:2.3
Usamos dos puntos como separador y ordenamos los valores en orden ascendente para la segunda columna El resultado Muy satisfactorio.
7 Otras opciones de clasificación comunes
-f convertirá todas las letras minúsculas a mayúsculas para compararlas, es decir, ignorará mayúsculas y minúsculas
-c comprobará si el el archivo ha sido ordenado. Si está desordenado, genera la información relevante de la primera línea desordenada y finalmente devuelve 1
-C verificará si el archivo ha sido ordenado. está desordenado, no genera el contenido, solo devuelve 1
-M ordenará por mes, como JAN es menor que FEB, etc.
-b ignorará todo partes en blanco delante de cada línea, comenzando desde los primeros caracteres visibles para comenzar a comparar.
A veces, cuando aprendes scripts, 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, hagámoslo! -k opción
1 Preparar materiales
$ cat facebook.txt
google 110 5000
baidu 100 5000
guge 50 3000
sohu 100 4500
El primer campo es el nombre de la empresa, el segundo campo es el número de personas de la empresa, y el tercer campo es el nombre de la empresa. El dominio es el salario promedio de los empleados. (Excepto el nombre de la empresa, todas las demás letras se escriben a ciegas^_^)
2 Quiero que este archivo esté ordenado alfabéticamente por empresa, es decir, ordenado por el primer campo: (Este El facebook El archivo .txt tiene tres campos)
$ sort -t -k 1 facebook.txt
baidu 100 5000
google 110 5000
guge 50 3000
sohu 100 4500
Míralo, solo usa -k 1 para configurarlo. (En realidad, esto no es estricto, lo sabrás más adelante)
3 Quiero que facebook.txt esté ordenado por la cantidad de personas en la empresa
$ sort -n -t -k 2 facebook .txt
guge 50 3000
baidu 100 5000
sohu 100 4500
google 110 5000
No es necesario que lo expliques, creo que lo entenderás.
Sin embargo, hay un problema aquí, es decir, el número de empresas en Baidu y Sohu es el mismo, 100 personas. ¿Qué debemos hacer en este momento según las reglas predeterminadas? orden ascendente a partir del primer dominio, por lo que baidu se ubica delante de sohu.
4 Quiero que facebook.txt esté ordenado por el número de personas de la empresa, y aquellos con el mismo número de personas ordenados en orden ascendente por el salario medio de los empleados:
$ sort -n -t -k 2 -k 3 facebook
guge 50 3000
sohu 100 4500
baidu 100 5000
.google 110 5000
Mira, agregamos un -k2 -k3 y el problema se resolvió. Sí, ordenar admite esta configuración, lo que significa establecer la prioridad de clasificación de dominios, ordenar primero por el segundo dominio y, si son iguales, ordenar por el tercer dominio. (Si lo desea, puede seguir escribiendo así y establecer muchas prioridades de clasificación)
5 Quiero que facebook.txt se ordene en orden descendente según el salario de los empleados. Si el número de empleados es el mismo, entonces. está ordenado en orden ascendente según el número de empresa: (Esto es un poco difícil)
$ sort -n -t -k 3r -k 2 facebook.txt
baidu 100. 5000
google 110 5000
Sohu 100 4500
guge 50 3000
Aquí se utilizan algunos trucos. Eche un vistazo más de cerca y agregue. ellos en secreto después de -k 3. Una letra minúscula r. Piénselo, combinado con nuestro artículo anterior, ¿puede obtener la respuesta revelada? Las opciones r y -r tienen el mismo efecto, lo que significa orden inverso. Debido a que la clasificación se ordena en orden ascendente de forma predeterminada, 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 ordenarse según el valor numérico. Por ejemplo:
$ sort -t -k 3nr -k 2n facebook.txt
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000
Mira, nosotros somos los primeros La opción -n se eliminó y se agregó a cada opción -k.
6 El formato de sintaxis específico de la opción -k
Si quieres seguir profundizando, debes adquirir algunos conocimientos teóricos. Debe comprender el formato de sintaxis de la opción -k, de la siguiente manera:
[ FStart [ .CStart ] ] [ Modifier ] [ , [ FEnd [ .CEnd ] ] [ Modifier ] ]
Este formato de sintaxis se puede dividir en dos partes mediante comas (?,?), la parte de inicio y la parte de fin.
Permítame darle una idea primero, es decir, si la parte Fin no está configurada, entonces se considera que Fin está configurado como el final de la línea. Este concepto es importante, pero muchas veces no se le presta atención.
La parte Inicio también se compone de tres partes. La parte Modificador es la parte de opción similar a n y r que mencionamos antes. Centrémonos en FStart y C.Start en la parte Inicio.
C.Start también se puede omitir. Si se omite, significa comenzar desde el principio de este dominio. -k 2 y -k 3 en los ejemplos anteriores son ejemplos de omisión de C.Start.
FStart.CStart, donde FStart representa el campo utilizado y CStart representa el carácter inicial en el campo FStart El primer carácter de clasificación.
De manera similar, en la sección Fin, puede configurar FEnd.CEnd. Si omite .CEnd, significa que el final del campo es el último carácter del campo. O, si establece CEnd en 0 (cero), también significa terminar al final del campo.
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 5000
sohu 100 4500
google 110 5000
guge 50 3000
Mira, usamos -k 1.2, esto indica que el Se ordena la cadena que comienza desde el segundo carácter del primer campo hasta el último carácter de este campo. Descubrirá que baidu está en la parte superior de la lista porque la segunda letra es a. Los segundos caracteres de sohu y google son ambos o, pero la h de sohu viene antes de la o de google, por lo que ocupan el segundo y tercer lugar respectivamente. Guge solo puede ocupar el cuarto lugar.
8 Otra idea repentina fue ordenar solo la segunda letra del nombre en inglés de la empresa. Si se hace lo mismo, ordenar en orden descendente según el salario de los empleados:
$ sort -. t -k 1.2,1.2 -k 3,3nr facebook.txt
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000
Dado que solo se ordena la segunda letra, usamos la expresión -k 1.2,1.2, lo que significa que solo ordenamos la segunda letra. (Si preguntas, ¿por qué no puedo usar -k 1.2? Por supuesto que no funciona, porque omites la parte Final, lo que significa que ordenarás la cadena desde la segunda letra hasta el último carácter de este campo) . Para ordenar los salarios de los empleados, también usamos -k 3,3, que es la expresión más precisa, lo que indica que solo ordenamos este campo, porque si omitimos los 3 siguientes, ¿ordenamos el contenido a partir de los 3 campos? ¿La última posición en el campo?
9 ¿Qué otras opciones se pueden usar en la sección de modificadores?
Puedes usar b, d, f, i, n o r.
Debes estar familiarizado con n y r.
b significa ignorar los símbolos de espacios en blanco de inicio de sesión en este dominio.
d significa ordenar este campo en orden lexicográfico (es decir, solo se consideran espacios y letras).
f significa ordenar este campo ignorando mayúsculas y minúsculas.
i significa ignorar los "caracteres no imprimibles" y ordenar sólo los caracteres imprimibles. (Algunos caracteres ASCII no se pueden imprimir, como \a significa alarma, \b significa retroceso, \n significa avance de línea, \r significa retorno de carro, etc.)
10 Piense en la combinación de - k y -u Ejemplos de uso:
$ cat facebook.txt
google 110 5000
baidu 100 5000
guge 50 3000
Sohu 100 4500
Este es el archivo facebook.txt original.
$ sort -n -k 2 facebook.txt
guge 50 3000
baidu 100 5000
sohu 100 4500
Google 110 5000
$ sort -n -k 2 -u facebook.txt
guge 50 3000
baidu 100 5000
Google 110 5000
Al configurar el valor para ordenar por dominio de empleado de la empresa y luego agregar -u, se eliminó la línea sohu. ¡Resulta que -u solo reconoce el dominio configurado con -k! Si se encuentra lo mismo, se eliminarán todas las filas idénticas posteriores.
$ sort -k 1 -u facebook.txt
baidu 100 5000
google 110 5000
guge 50 3000
sohu 100 4500
$ sort -k 1.1,1.1 -u facebook.txt
baidu 100 5000
google 110 5000
sohu 100 4500
Lo mismo se aplica a este ejemplo. Guge cuyo primer carácter es g no sobrevivirá.
$ sort -n -k 2 -k 3 -u facebook.txt
guge 50 3000
sohu 100 4500
baidu 100 5000
Google 110 5000
¡Oye! Cuando se establecen aquí dos niveles de prioridades de clasificación, no se elimina ninguna fila usando -u. Resulta que -u sopesará todas las opciones -k y eliminará solo las que sean iguales. Siempre que haya un nivel de diferencia entre ellas, no se eliminarán fácilmente :) (Si no lo cree. , puedes agregar una línea de sina 100 4500 y probarlo tú mismo)
11 El tipo más extraño:
$ sort -n -k 2.2,3.1 facebook.txt
guge 50 3000
baidu 100 5000
p>
sohu 100 4500
google 110 5000
Empezar con el segundo carácter del segundo campo y termina con el primer carácter del tercer campo.
La primera línea extraerá 0 3, la segunda línea extraerá 00 5, la tercera línea extraerá 00 4 y la cuarta línea extraerá 10 5.
¿Y porque sort piensa que 0 es menor que 00 y menos que 000 es menor que 0000?
Entonces 0 3 debe ser el primero. 10 5 definitivamente está en el último. Pero, ¿por qué está 00 5 delante de 00 4? (Puedes hacer tus propios experimentos y pensar en ello).
Se revela la respuesta: resulta que la configuración entre dominios es una ilusión y sort solo comparará el segundo dominio desde el segundo carácter hasta el último carácter del segundo campo, sin incluir los caracteres iniciales del tercer campo en el rango de comparación. Cuando se descubre que 00 y 00 son iguales, ordenar comparará automáticamente el primer campo. Por supuesto que baidu está delante de sohu.
Se puede utilizar un ejemplo para confirmar:
$ sort -n -k 2.2,3.1 -k 1,1r facebook.txt
guge 50 3000
sohu 100 4500
baidu 100 5000
google 110 5000
12 A veces verás los símbolos +1 -2 después del comando de clasificación.
Con respecto a esta sintaxis, la última clasificación la explica así:
En sistemas más antiguos, `sort? admite una sintaxis obsoleta de origen cero `+POS1 [-POS2] ? claves de clasificación. POSIX 1003.1-2001 (*nota Conformidad con los estándares::) no permite esto; utilice `-k?
Resulta que esta antigua representación ha sido eliminada. ¡Puedo despreciar con confianza los scripts que usan este método de representación!
(Para evitar la existencia de scripts antiguos, permítanme hablar sobre este método de representación nuevamente. El signo más representa la parte de Inicio y el signo menos representa la parte). la parte final. El punto 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, y el segundo carácter anterior se representa aquí como el primer campo)
.