[Edición de documentos de la colección de comandos de Shell] Guía de uso del comando de clasificación del comando de clasificación de Linux


Columna de comandos de shell: análisis completo de los comandos de shell de Linux


describir


El comando sort es un comando en Linux para ordenar el contenido de los archivos de texto. Ordena las líneas en un archivo alfabéticamente, numéricamente o por otro campo especificado, y envía el resultado a la salida estándar.

El comando ordenar se puede utilizar para ordenar archivos de texto en orden ascendente o descendente. De forma predeterminada, el comando ordenar ordena cada línea del archivo en orden alfabético y genera los resultados ordenados línea por línea. La clasificación se basa en el valor Unicode del carácter, por lo que las letras mayúsculas se ordenan antes que las minúsculas.

El comando de clasificación también admite la clasificación en varios campos. Cada línea se puede dividir en varios campos especificando un delimitador de campo y ordenarse según el campo especificado. De esta forma, los datos de la tabla se pueden ordenar, por ejemplo, la tabla se puede ordenar según el valor numérico de una determinada columna.

El comando ordenar también se puede usar para procesar archivos grandes. Puede clasificar archivos grandes mediante el uso de archivos temporales y fusionar el algoritmo de clasificación para evitar problemas de falta de memoria.

En general, el comando ordenar es una herramienta muy útil que puede ayudarnos a ordenar y organizar archivos de texto, haciendo que los datos sean más fáciles de leer y procesar.


formato gramatical

sort [OPTIONS] [FILE]

Descripción de parámetros

  • -r: Ordenar en orden descendente.
  • -n: Ordenar por valor numérico.
  • -t <字符>: Especifica el separador de campo.
  • -k <字段>: Ordenar por el campo especificado.
  • -u: elimine las líneas duplicadas y conserve solo una copia.
  • -m: combina y ordena el contenido de varios archivos.

condición de error

  • Si el archivo especificado no existe, el comando ordenar mostrará un mensaje de error.
  • Si no se especifica ningún archivo como entrada, o si el archivo de entrada está vacío, el comando ordenar leerá los datos de la entrada estándar para ordenarlos.
  • Si el número de campos especificado excede el número de campos en el archivo, el comando de clasificación ignorará la línea.
  • Si se utiliza una opción de parámetro no válida, el comando de clasificación mostrará un mensaje de error.

Nota: Los parámetros y opciones del comando ordenar se pueden combinar y usar de acuerdo con las necesidades específicas, y se pueden usar de manera flexible de acuerdo con la situación real.

Precauciones

Hay algunas cosas a tener en cuenta al usar el comando ordenar en el shell de Linux:

  1. Clasificación de cadenas: de forma predeterminada, el comando ordenar ordena el texto alfabéticamente. Si desea ordenar de acuerdo con otras reglas, por ejemplo, de acuerdo con el tamaño del número, debe usar las opciones de parámetros adecuadas, como -n.

  2. Separador de campos: si desea ordenar los campos en el archivo, debe especificar el separador de campos. Utilice -tlas opciones para establecer el delimitador de campo, por ejemplo, -t ,para utilizar una coma como delimitador de campo.

  3. Ordenación de campos: use -kla opción para especificar por qué campo ordenar. Puede especificar un solo campo o varios campos. Por ejemplo, -k 2significa ordenar por el segundo campo, -k 2,3significa ordenar por el segundo campo y el tercer campo.

  4. Se distingue entre mayúsculas y minúsculas: el comando ordenar ordena los caracteres según sus valores Unicode de forma predeterminada, por lo que las letras mayúsculas se ordenarán antes que las minúsculas. Si desea una clasificación que no distinga entre mayúsculas y minúsculas, puede usar -flas opciones.

  5. Deduplicación: use -ula opción para eliminar líneas duplicadas y conservar solo una copia.

  6. Manejo de archivos grandes: cuando se trata de archivos grandes, el comando ordenar puede causar problemas debido a la falta de memoria. Las opciones se pueden usar -Tpara especificar un directorio para archivos temporales o para --buffer-sizeajustar el tamaño del búfer para optimizar el rendimiento.

  7. Salida de resultados: el comando de clasificación genera los resultados de la clasificación en la salida estándar de forma predeterminada. Si necesita guardar el resultado en un archivo, puede usar la notación de redirección >.

  8. Manejo de errores: si el comando de clasificación encuentra un error, como una opción de parámetro no válida o un archivo que no existe, se mostrará un mensaje de error. Preste atención para verificar el mensaje de error y tratarlo en consecuencia.

Las anteriores son algunas precauciones al usar el comando sort en Linux Shell. La comprensión y el uso correctos de estas consideraciones pueden ayudarnos a aplicar mejor el comando sort para clasificar y procesar texto.


implementación subyacente

La implementación subyacente del comando sort en Linux Shell usa el algoritmo Merge Sort. Merge sort es un algoritmo de divide y vencerás que divide los datos que se clasificarán en subproblemas más pequeños, luego resuelve recursivamente estos subproblemas y combina los resultados para obtener el resultado ordenado final.

La implementación subyacente del comando sort se puede dividir aproximadamente en los siguientes pasos:

  1. Leer archivo: el comando ordenar primero leerá el contenido del archivo de entrada y usará cada línea como un elemento para ordenar.

  2. Segmentación y clasificación: el comando de clasificación dividirá el contenido leído en múltiples bloques pequeños, y el tamaño de cada bloque pequeño se adaptará a la memoria disponible. A continuación, se clasifica cada bloque pequeño mediante un algoritmo de clasificación interno, generalmente Quick Sort o Heap Sort.

  3. Combinar: el comando ordenar combina los bloques ordenados. La operación de fusión es el proceso de fusionar varios bloques pequeños ordenados en un bloque ordenado más grande. Aquí se utiliza la idea central del algoritmo de clasificación por fusión.

  4. Fusión repetida: si la cantidad de datos ordenados excede el límite de memoria, el comando ordenar escribirá los resultados fusionados en un archivo temporal y utilizará el archivo temporal como una nueva entrada. Luego, la operación de fusión se repite hasta que todos los bloques pequeños se fusionan en un resultado ordenado.

  5. Resultados de salida: finalmente, el comando de clasificación genera los resultados ordenados en la salida estándar o los escribe en el archivo de salida especificado.

Cabe señalar que el comando de clasificación puede optimizarse en la implementación real, como el uso de subprocesos múltiples o el procesamiento múltiple para acelerar el proceso de clasificación, o el uso de algunos trucos algorítmicos para mejorar el rendimiento y reducir el uso de memoria.

La complejidad temporal del algoritmo de ordenación por fusión es O(n log n), donde n es el número de datos que se van a ordenar. Por lo tanto, el comando ordenar aún puede mantener un buen rendimiento al procesar archivos grandes.


ejemplo

ejemplo uno

sort file.txt

Este comando ordenará alfabéticamente cada línea en el archivo file.txt y enviará el resultado a la salida estándar.

ejemplo dos

sort -r file.txt

Este comando ordenará alfabéticamente cada línea en el archivo file.txt en orden descendente y mostrará el resultado en la salida estándar.

ejemplo tres

sort -n numbers.txt

Este comando ordenará cada línea en el archivo number.txt por valor numérico y enviará el resultado a la salida estándar. Los números se ordenarán en orden ascendente.

ejemplo cuatro

sort -t ',' -k 2 file.csv

Este comando ordenará el segundo campo en el archivo file.csv con una coma como separador de campo y enviará el resultado a la salida estándar.

ejemplo cinco

sort -u file.txt

Este comando ordenará cada línea en el archivo file.txt y enviará el resultado a la salida estándar. Las filas duplicadas se eliminarán y solo se conservará una copia.

ejemplo seis

sort -k 3,3 -n grades.txt

Este comando ordenará numéricamente de acuerdo con el tercer campo en el archivo grades.txt y enviará el resultado a la salida estándar.

ejemplo siete

sort -m file1.txt file2.txt

Este comando ordenará el contenido de file1.txt y file2.txt y enviará el resultado a la salida estándar. Si los archivos ya están ordenados alfabéticamente, puede usar la opción -m para una ordenación combinada.


implementado en lenguaje c


El siguiente es un ejemplo de un comando de ordenación similar implementado en código C, donde un archivo de texto se ordena usando el algoritmo de ordenación por combinación:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_LINE_LENGTH 1000

// 归并排序的合并操作
void merge(char** arr, int left, int mid, int right) {
    
    
    int i, j, k;
    int n1 = mid - left + 1;
    int n2 = right - mid;

    // 创建临时数组
    char** L = (char**)malloc(n1 * sizeof(char*));
    char** R = (char**)malloc(n2 * sizeof(char*));

    // 将数据复制到临时数组
    for (i = 0; i < n1; i++)
        L[i] = arr[left + i];
    for (j = 0; j < n2; j++)
        R[j] = arr[mid + 1 + j];

    // 归并临时数组
    i = 0;
    j = 0;
    k = left;
    while (i < n1 && j < n2) {
    
    
        if (strcmp(L[i], R[j]) <= 0) {
    
    
            arr[k] = L[i];
            i++;
        } else {
    
    
            arr[k] = R[j];
            j++;
        }
        k++;
    }

    // 复制剩余的元素
    while (i < n1) {
    
    
        arr[k] = L[i];
        i++;
        k++;
    }
    while (j < n2) {
    
    
        arr[k] = R[j];
        j++;
        k++;
    }

    // 释放临时数组
    free(L);
    free(R);
}

// 归并排序
void mergeSort(char** arr, int left, int right) {
    
    
    if (left < right) {
    
    
        int mid = left + (right - left) / 2;

        // 递归地排序左右两部分
        mergeSort(arr, left, mid);
        mergeSort(arr, mid + 1, right);

        // 合并两个有序数组
        merge(arr, left, mid, right);
    }
}

int main() {
    
    
    FILE* file = fopen("input.txt", "r");
    if (file == NULL) {
    
    
        printf("Failed to open file\n");
        return 1;
    }

    char** lines = NULL;
    int numLines = 0;

    // 读取文件内容到动态数组
    char line[MAX_LINE_LENGTH];
    while (fgets(line, sizeof(line), file) != NULL) {
    
    
        line[strcspn(line, "\n")] = '\0';  // 去除换行符
        numLines++;
        lines = (char**)realloc(lines, numLines * sizeof(char*));
        lines[numLines - 1] = strdup(line);
    }

    // 使用归并排序对动态数组进行排序
    mergeSort(lines, 0, numLines - 1);

    // 输出排序结果
    for (int i = 0; i < numLines; i++) {
    
    
        printf("%s\n", lines[i]);
        free(lines[i]);
    }

    // 释放动态数组
    free(lines);

    fclose(file);
    return 0;
}

Este código de ejemplo utiliza el algoritmo de ordenación por combinación para ordenar un archivo de texto. Primero, abre y lee el archivo llamado "input.txt", almacenando cada línea como una cadena en una matriz dinámica lines. Luego, use el algoritmo de ordenación por fusión para ordenar la matriz dinámica y envíe los resultados ordenados a la salida estándar. Finalmente, libere la matriz dinámica y cierre el archivo.

Nota: Las funciones de asignación y desasignación de memoria dinámica y malloclas funciones de manejo de cadenas y se utilizan en el código de muestra . Estas funciones deben incluir archivos de encabezado y . Además, el código de muestra asume que la longitud de cada línea del archivo de entrada no excede los caracteres, que se pueden ajustar según las necesidades reales.reallocfreestrdupstrcspnstdlib.hstring.hMAX_LINE_LENGTH


epílogo

Durante nuestra exploración, hemos obtenido información sobre el poder y la amplia aplicación de los comandos de shell. Sin embargo, aprender estas técnicas es solo el comienzo. El verdadero poder radica en cómo los incorpora a su trabajo diario para aumentar la eficiencia y la productividad.

La psicología nos dice que el aprendizaje es un proceso continuo y comprometido. Por lo tanto, los animo no solo a leer y comprender estos mandamientos, sino también a practicarlos. Intente crear sus propios comandos y domine gradualmente la programación de shell como parte de su rutina diaria.

同时,请记住分享是学习过程中非常重要的一环。如果你发现本博客对你有帮助,请不吝点赞并留下评论。分享你自己在使用Shell命令时遇到的问题或者有趣的经验,可以帮助更多人从中学习。
此外,我也欢迎你收藏本博客,并随时回来查阅。因为复习和反复实践也是巩固知识、提高技能的关键。

最后,请记住:每个人都可以通过持续学习和实践成为Shell编程专家。我期待看到你在这个旅途中取得更大进步!


阅读我的CSDN主页,解锁更多精彩内容:泡沫的CSDN主页

在这里插入图片描述

Supongo que te gusta

Origin blog.csdn.net/qq_21438461/article/details/131368903
Recomendado
Clasificación