El comando comm de la familia de sistemas operativos Unix es una utilidad que se utiliza para comparar dos archivos en busca de líneas comunes y distintas. comm se especifica en el estándar POSIX . Ha estado ampliamente disponible en sistemas operativos tipo Unix desde mediados y fines de la década de 1980.
Escrito por Lee E. McMahon , comm apareció por primera vez en la versión 4 de Unix . [1]
La versión de comm incluida en GNU coreutils fue escrita por Richard Stallman y David MacKenzie. [2]
comm lee dos archivos como entrada, considerados como líneas de texto. comm genera un archivo, que contiene tres columnas. Las primeras dos columnas contienen líneas exclusivas del primer y segundo archivo, respectivamente. La última columna contiene líneas comunes a ambos. Funcionalmente, esto es similar a diff .
Las columnas se distinguen normalmente con el carácter <tab> . Si los archivos de entrada contienen líneas que comienzan con el carácter separador, las columnas de salida pueden volverse ambiguas.
Para lograr una mayor eficiencia, las implementaciones estándar de comm esperan que ambos archivos de entrada se ordenen en el mismo orden de intercalación de líneas y se ordenen léxicamente. El comando sort (Unix) se puede utilizar para este propósito.
El algoritmo de comunicación utiliza la secuencia de intercalación de la configuración regional actual . Si las líneas de los archivos no están intercaladas de acuerdo con la configuración regional actual, el resultado no está definido.
A diferencia de diff , el código de retorno de comm no tiene importancia lógica en cuanto a la relación entre los dos archivos. Un código de retorno de 0 indica éxito, un código de retorno >0 indica que ocurrió un error durante el procesamiento.
$ cat foo manzana plátano berenjena $ cat bar manzana plátano plátano calabacín $ comm foo bar manzana plátano plátano berenjena calabacín
Esto muestra que ambos archivos tienen un plátano, pero solo la barra tiene un segundo plátano.
En más detalle, el archivo de salida tiene la apariencia que se muestra a continuación. Observe que la columna se interpreta por la cantidad de caracteres de tabulación iniciales. \t representa un carácter de tabulación y \n representa una nueva línea ( carácter de escape#Programación y formatos de datos ).
En términos generales, diff es una utilidad más potente que comm . El más simple comm es el más adecuado para su uso en scripts.
La principal distinción entre comm y diff es que comm descarta información sobre el orden de las líneas antes de la clasificación.
Una pequeña diferencia entre comm y diff es que comm no intentará indicar que una línea ha "cambiado" entre los dos archivos; las líneas se muestran en las columnas "desde el archivo n.° 1", "desde el archivo n.° 2" o "en ambos". Esto puede ser útil si se desea que dos líneas se consideren diferentes incluso si solo tienen diferencias sutiles.
comm tiene opciones de línea de comandos para suprimir cualquiera de las tres columnas. Esto resulta útil para la creación de scripts.
También existe una opción para leer un archivo (pero no ambos) desde la entrada estándar.
Se debe almacenar en búfer hasta una línea completa de cada archivo de entrada durante la comparación de líneas, antes de escribir la siguiente línea de salida.
Algunas implementaciones leen líneas con la función readlinebuffer() que no impone ningún límite de longitud de línea si la memoria del sistema es suficiente.
Otras implementaciones leen líneas con la función fgets () . Esta función requiere un búfer fijo. Para estas implementaciones, el búfer suele tener un tamaño acorde a la macro POSIX LINE_MAX .