El comando comm de #GNU

Demos un repaso al uso del comando comm del sitema GNU

Los comandos de GNU coreutils son las herramientas básicas de nuestros sistemas GNU con kernel Linux similares a las de sistemas Unix, para gestionar desde la línea de comandos el sistema y operaciones con archivos de texto.

Vamos a repasar las opciones y uso del comando comm que sirve para comparar dos archivos ordenados, línea por línea y nos mostrará el resultado de dicha comparación.

El comando comm, sirve para comparar dos archivos que previamente ya estuvieran ordenados, importante matiz, y si lo ejecutamos sin más mostrará tres columnas separadas por tabuladores en los que podremos encontrar:

  • primera columna: el texto que únicamente aparece en el primer archivo
  • segunda columna: el texto que únicamente aparece en el segundo archivo
  • tercera columna: el texto común que aparece en ambos archivos

Primero vamos a ordenar el contenido de los dos archivos que vamos a comparar, para ello vamos a utilizar el comando sort y guardar el contenido en los propios archivos. Tenemos dos archivos llamados archivo1.txt y archivo2.txt

Para ordenar un archivo y que lo guarde en el mismo archivo ejecutaremos:

sort -o archivo1.txt archivo1.txt

Hacemos esto con los dos archivos y podemos ver lo que hay en los archivos mediante:

head archivo1.txt archivo2.txt  
==> archivo1.txt <==
aloha mundo!
linea 2
linea 3
naranja

==> archivo2.txt <==
hola mundo!
linea 2
linea 3
linea 4
naranja

Ahora ejecutemos el comando comm:

comm archivo1.txt archivo2.txt  
aloha mundo!
        hola mundo!
                linea 2
                linea 3
        linea 4
                naranja

Como decía antes, sin más parámetros el comando nos muestra 3 columnas. Las líneas que solo aparecen en el primer archivo, las que aparecen solo en el segundo y las que son comunes en ambas.

Podemos eliminar alguna de esas columnas con las opciones -1 o -2 o -3 que suprime la primera, la segunda o la tercera columna respectivamente.

Mostremos únicamente las líneas comunes que aparecen en ambos archivos mediante:

comm -12 archivo1.txt archivo2.txt 
linea 2
linea 3
naranja

También podremos configurar el texto que separa las columnas. Por ejemplo, vamos a separar las columnas con guiones:

comm archivo1.txt archivo2.txt --output-delimiter=-------------
aloha mundo!
-------------hola mundo!
--------------------------linea 2
--------------------------linea 3
-------------linea 4
--------------------------naranja

Tiene otro par de opciones para decirle al comando que no están ordenados los archivos o para comprobar el orden, pero no son muy útiles.

El comando en sí, no es muy potente si lo comparamos con otras opciones como diff, pero el comando comm al ser más simple, nos puede ser más útil a la hora de ejecutarlo en algún script en el que lo necesitemos.

La verdad es que la información presentada es muy espartana, lo que es genial si usamos el comando en un script, pero si lo usamos como comando, quizás se le puede añadir un pequeño encabezado de la siguiente manera:

echo "archivo 1          archivo 2          ambos" && echo "---------------------------------------------" && comm archivo1.txt archivo2.txt --output-delimiter="                   "
archivo 1          archivo 2          ambos
---------------------------------------------
aloha mundo!
                   hola mundo!
                                      linea 2
                                      linea 3
                   linea 4
                                      naranja

También podemos añadir la opción –total para que nos muestre un recuento del contenido de elementos de cada columna en la parte inferior.

También existe la posibilidad de comparar un archivo (no pueden ser los dos) con la entrada estandar, es decir texto introducido por teclado:

comm archivo1.txt -   

Ahora vamos escribiendo cadenas de texto (en forma ordenada) para que las compare con archivo 1. Y nos dirá si estaban en el archivo, si solo aparecen en lo que hemos escrito o si están en ambos archivos. Para terminar pulsamos Ctrl+D.


Estás serían las maneras de utilizar este comando estándar de POSIX escrito para GNU por Richard M. Stallman y David MacKenzie. Quizás útil a la hora de incluirlo en algún script.

4 comentarios sobre “El comando comm de #GNU

  1. El nombre del comando me hacía pensar en el antiguo puerto COM de los ordenadores. 😛

    No le he prestado mucha atención al artículo (lo siento) ya que no me atraía mucho tras leer hasta el 3er párrafo. Lo que leía me hacía pensar en el comando diff (supongo que este no será de coreutils porque parecen iguales).

    Saludos

  2. Hola Victorhck,

    Perdona por el off-topic pero lleva una semana la actualización de PlanetaLibre caída, desde el ultimo commit, es probable que algún proceso no este funcionando bien.

    Un saludo, maRc:-)

    1. Hola!
      Ningún problema por el offtopic. La verdad es que es la Raspberry Pi, que no sé que le pasa que no arranca… 😦
      No he tenido mucho tiempo para tratar de averiguar qué le pasa…
      Siento mucho la falta de actualización, veré si lo puedo hacer manualmente desde mi portátil…
      Saludos!!

Me gustaría saber tu opinión. Deja un comentario (Puedes usar MarkDown)

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.