Cómo usar el comando de unión en Linux

Un indicador de terminal listo para un comando en un sistema Linux.
Fatmawati Achmad Zaenuri / Shutterstock

Si desea fusionar datos de dos archivos de texto haciendo coincidir un campo común, puede usar el joincomando de Linux . Agrega una pizca de dinamismo a sus archivos de datos estáticos. Te mostraremos cómo usarlo.

Coincidencia de datos entre archivos

Los datos son el rey. Corporaciones, negocios y hogares lo manejan. Pero los datos almacenados en diferentes archivos y recopilados por diferentes personas son una molestia. Además de saber qué archivos abrir para encontrar la información que desea, es probable que el diseño y el formato de los archivos sean diferentes.

También debe lidiar con el dolor de cabeza administrativo de qué archivos deben actualizarse, cuáles deben respaldarse, cuáles son heredados y cuáles pueden archivarse.

Además, si necesita consolidar sus datos o realizar algún análisis en un conjunto de datos completo, tiene un problema adicional. ¿Cómo racionaliza los datos en los diferentes archivos antes de poder hacer lo que necesita hacer con ellos? ¿Cómo aborda la fase de preparación de datos?

La buena noticia es que si los archivos comparten al menos un elemento de datos común, el joincomando de Linux puede sacarlo del fango.

Los archivos de datos

Todos los datos que usaremos para demostrar el uso del joincomando son ficticios, comenzando con los siguientes dos archivos:

archivo cat-1.txt
archivo cat-2.txt

El contenido de "cat file-1.txt" y "cat file-2.txt" en una ventana de terminal.

El siguiente es el contenido de  file-1.txt:

1 Adore Varian [email protected] Mujer 192.57.150.231
2 Nancee Merrell [email protected] Mujer 22.198.121.181
3 Herta Friett [email protected] Mujer 33.167.32.89
4 Torie Venmore [email protected] Mujer 251.9.204.115
5 Deni Sealeaf [email protected] Mujer 210.53.81.212
6 Fidel Bezley [email protected] Hombre 72.173.218.75
7 Ulrikaumeko Standen [email protected] Mujer 4.204.0.237
8 Odell Jursch [email protected] Hombre 1.138.85.117

Tenemos un conjunto de líneas numeradas y cada línea contiene toda la siguiente información:

  • Un número
  • Un nombre
  • Un apellido
  • Una dirección de correo electrónico
  • El sexo de la persona
  • Una dirección IP

El siguiente es el contenido de file-2.txt:

1 Varian [email protected] Mujer Oeste de Nueva York $ 535,304.73
2 Merrell [email protected] Finger Lakes hembra $ 309,033.10
3 Friett [email protected] Mujer Nivel Sur $ 461,664.44
4 Venmore [email protected] Mujer Central New York $ 175,818.02
5 Sealeaf [email protected] Mujer North Country $ 126,690.15
6 Bezley [email protected] Hombre Mohawk Valley $ 366,733.78
7 Standen [email protected] Female Capital District $ 674,634.93
8 Jursch [email protected] Hombre Hudson Valley $ 663,821.09

Cada línea file-2.txtcontiene la siguiente información:

  • Un número
  • Un apellido
  • Una dirección de correo electrónico
  • El sexo de la persona
  • Una región de Nueva York
  • Un valor en dólares

El joincomando funciona con «campos», que, en este contexto, significa una sección de texto rodeada por espacios en blanco, el comienzo de una línea o el final de una línea. Para joinhacer coincidir las líneas entre los dos archivos, cada línea debe contener un campo común.

Por lo tanto, solo podemos hacer coincidir un campo si aparece en ambos archivos. La dirección IP solo aparece en un archivo, por lo que no es bueno. El primer nombre solo aparece en un archivo, por lo que tampoco podemos usarlo. El apellido está en ambos archivos, pero sería una mala elección, ya que diferentes personas tienen el mismo apellido.

Relacionado:  Cómo exportar e importar sus sistemas Linux en Windows 10

Tampoco puede vincular los datos con las entradas masculinas y femeninas, porque son demasiado vagas. Las regiones de Nueva York y los valores en dólares solo aparecen en un archivo también.

Sin embargo, podemos usar la dirección de correo electrónico porque está presente en ambos archivos y cada uno es único para un individuo. Un vistazo rápido a los archivos también confirma que las líneas en cada uno corresponden a la misma persona, por lo que podemos usar los números de línea como nuestro campo para hacer coincidir (usaremos un campo diferente más adelante).

Tenga en cuenta que hay un número diferente de campos en los dos archivos, lo cual está bien: podemos decir joinqué campo usar de cada archivo.

Sin embargo, tenga cuidado con campos como las regiones de Nueva York; en un archivo separado por espacios, cada palabra en el nombre de una región parece un campo. Debido a que algunas regiones tienen nombres de dos o tres palabras, en realidad tiene un número diferente de campos dentro del mismo archivo. Esto está bien, siempre que coincida en los campos que aparecen en la línea antes de las regiones de Nueva York.

El comando de unión

Primero, el campo que va a hacer coincidir debe estar ordenado. Tenemos números ascendentes en ambos archivos, por lo que cumplimos con ese criterio. De forma predeterminada, joinutiliza el primer campo de un archivo, que es lo que queremos. Otro valor predeterminado sensato es que joinespera que los separadores de campo sean espacios en blanco. Una vez más, lo tenemos, así que podemos seguir adelante y disparar join.

Como usamos todos los valores predeterminados, nuestro comando es simple:

unirse a archivo-1.txt archivo-2.txt

El comando "unir archivo-1.txt archivo-2.txt" en una ventana de terminal.

join considera que los archivos son «archivo uno» y «archivo dos» de acuerdo con el orden en el que aparecen en la línea de comandos.

El resultado es el siguiente:

1 Adore Varian [email protected] Mujer 192.57.150.231 Varian [email protected] Mujer Oeste de Nueva York $ 535,304.73
2 Nancee Merrell [email protected] Mujer 22.198.121.181 Merrell [email protected] Mujer Finger Lakes $ 309,033.10
3 Herta Friett [email protected] Mujer 33.167.32.89 Friett [email protected] Mujer Nivel Sur $ 461,664.44
4 Torie Venmore [email protected] Mujer 251.9.204.115 Venmore [email protected] Mujer Central New York $ 175,818.02
5 Deni Sealeaf [email protected] Mujer 210.53.81.212 Sealeaf [email protected] Mujer North Country $ 126,690.15
6 Fidel Bezley [email protected] Hombre 72.173.218.75 Bezley [email protected] Hombre Mohawk Valley $ 366,733.78
7 Ulrikaumeko Standen [email protected] Mujer 4.204.0.237 Standen [email protected] Mujer Distrito Capital $ 674,634.93
8 Odell Jursch [email protected] Hombre 1.138.85.117 Jursch [email protected] Hombre Hudson Valley $ 663,821.09

La salida se formatea de la siguiente manera: El campo en el que se hicieron coincidir las líneas se imprime primero, seguido de los otros campos del archivo uno y luego los campos del archivo dos sin el campo de coincidencia.

Campos sin clasificar

Intentemos algo que sabemos que no funcionará. Pondremos las líneas en un archivo fuera de orden para  joinque no podamos procesar el archivo correctamente. El contenido de  file-3.txt es el mismo que file-2.txt, pero la línea ocho está entre las líneas cinco y seis.

Relacionado:  Cómo agregar una GUI a los scripts de Shell de Linux

El siguiente es el contenido de file-3.txt:

1 Varian [email protected] Mujer Oeste de Nueva York $ 535,304.73
2 Merrell [email protected] Finger Lakes hembra $ 309,033.10
3 Friett [email protected] Mujer Nivel Sur $ 461,664.44
4 Venmore [email protected] Mujer Central New York $ 175,818.02
5 Sealeaf [email protected] Mujer North Country $ 126,690.15
8 Jursch [email protected] Hombre Hudson Valley $ 663,821.09
6 Bezley [email protected] Hombre Mohawk Valley $ 366,733.78
7 Standen [email protected] Female Capital District $ 674,634.93

Escribimos el siguiente comando para intentar unirse file-3.txta file-1.txt:

unirse a archivo-1.txt archivo-3.txt

El comando "unir archivo-1.txt archivo-3.txt" en una ventana de terminal.

join informa que la séptima línea file-3.txtestá fuera de servicio, por lo que no se procesa. La línea siete es la que comienza con el número seis, que debe ir antes del ocho en una lista ordenada correctamente. La sexta línea del archivo (que comienza con «8 Odell») fue la última procesada, por lo que vemos el resultado.

Puede usar la --check-orderopción si desea ver si joinestá satisfecho con el orden de clasificación de los archivos; no se intentará combinar.

Para hacerlo, escribimos lo siguiente:

unirse --check-order file-1.txt file-3.txt

El comando "join --check-order file-1.txt file-3.txt" en una ventana de terminal.

joinle dice de antemano que habrá un problema con la línea siete del archivo file-3.txt.

Archivos con líneas faltantes

En  file-4.txt, se ha eliminado la última línea, por lo que no hay una línea ocho. Los contenidos son los siguientes:

1 Varian [email protected] Mujer Oeste de Nueva York $ 535,304.73
2 Merrell [email protected] Finger Lakes hembra $ 309,033.10
3 Friett [email protected] Mujer Nivel Sur $ 461,664.44
4 Venmore [email protected] Mujer Central New York $ 175,818.02
5 Sealeaf [email protected] Mujer North Country $ 126,690.15
6 Bezley [email protected] Hombre Mohawk Valley $ 366,733.78
7 Standen [email protected] Female Capital District $ 674,634.93

Escribimos lo siguiente y, sorprendentemente, joinno se queja y procesa todas las líneas que puede:

unirse a archivo-1.txt archivo-4.txt

El comando "unir archivo-1.txt archivo-4.txt" en una ventana de terminal.

La salida enumera siete líneas fusionadas.

La -aopción (imprimir no emparejable) indica joinque también se impriman las líneas que no se pudieron emparejar.

Aquí, escribimos el siguiente comando para indicarle  joinque imprima las líneas del archivo uno que no pueden coincidir con las líneas del archivo dos:

unirse -a 1 archivo-1.txt archivo-4.txt

El comando "join -a 1 file-1.txt file-4.txt" en una ventana de terminal.

Siete líneas coinciden y la línea ocho del archivo uno se imprime, sin coincidencia. No hay ninguna información combinada porque file-4.txt no contiene una línea ocho con la que pueda coincidir. Sin embargo, al menos todavía aparece en la salida para que sepa que no tiene una coincidencia en  file-4.txt.

Escribimos el siguiente -vcomando (suprimir líneas unidas) para revelar las líneas que no coinciden:

unirse -v archivo-1.txt archivo-4.txt

El comando "join -v file-1.txt file-4.txt" en una ventana de terminal.

Vemos que la línea ocho es la única que no tiene una coincidencia en el archivo dos.

Coincidencia de otros campos

Hagamos coincidir dos archivos nuevos en un campo que no es el predeterminado (campo uno). El siguiente es el contenido de file-7.txt:

[email protected] Mujer 192.57.150.231
[email protected] Mujer 210.53.81.212
[email protected] Hombre 72.173.218.75
[email protected] Mujer 33.167.32.89
[email protected] Mujer 22.198.121.181
[email protected] Hombre 1.138.85.117
[email protected] Mujer 251.9.204.115
[email protected] Mujer 4.204.0.237

Y el siguiente es el contenido de file-8.txt:

Mujer [email protected] Oeste de Nueva York $ 535,304.73
Mujer [email protected] North Country $ 126,690.15
Hombre [email protected] Mohawk Valley $ 366,733.78
Mujer [email protected] Nivel Sur $ 461,664.44
Mujer [email protected] Finger Lakes $ 309,033.10
Hombre [email protected] Hudson Valley $ 663,821.09
Mujer [email protected] Central New York $ 175,818.02
Mujer [email protected] Distrito Capital $ 674,634.93

El único campo sensato que se puede utilizar para unirse es la dirección de correo electrónico, que es el campo uno en el primer archivo y el campo dos en el segundo. Para adaptarse a esto, podemos usar las opciones -1(archivo de un campo) y -2(archivo de dos campos). Seguiremos estos con un número que indica qué campo en cada archivo debe usarse para unirse.

Relacionado:  Cómo usar Pipes en Linux

Escribimos lo siguiente para decirle joinque use el primer campo en el archivo uno y el segundo en el archivo dos:

unirse -1 1-2 2 archivo-7.txt archivo-8.txt

El comando "join -1 1 -2 2 file-7.txt file-8.txt" en una ventana de terminal.

Los archivos se unen en la dirección de correo electrónico, que se muestra como el primer campo de cada línea en la salida.

Usando diferentes separadores de campo

¿Qué sucede si tiene archivos con campos que están separados por algo que no sea un espacio en blanco?

Los dos archivos siguientes están delimitados por comas; el único espacio en blanco está entre los nombres de lugares de varias palabras:

archivo cat-5.txt
archivo cat-6.txt

El contenido de "cat file-5.txt" y "cat file-6.txt" en una ventana de terminal.

Podemos usar el -t(carácter separador) para decir joinqué carácter usar como separador de campo. En este caso, es la coma, por lo que escribimos el siguiente comando:

unirse -t, archivo-5.txt archivo-6.txt

El comando "join -t, file-5.txt file-6.txt" en una ventana de terminal.

Todas las líneas coinciden y los espacios se conservan en los nombres de los lugares.

Ignorar mayúsculas y minúsculas

Otro archivo, file-9.txtes casi idéntico a  file-8.txt. La única diferencia es que algunas de las direcciones de correo electrónico tienen una letra mayúscula, como se muestra a continuación:

Mujer [email protected] Oeste de Nueva York $ 535,304.73
Mujer [email protected] North Country $ 126,690.15
Hombre [email protected] Mohawk Valley $ 366,733.78
Mujer [email protected] Nivel Sur $ 461,664.44
Mujer [email protected] Finger Lakes $ 309,033.10
Hombre [email protected] Hudson Valley $ 663,821.09
Mujer [email protected] Central New York $ 175,818.02
Mujer [email protected] Distrito Capital $ 674,634.93

Cuando nos unimos file-7.txty file-8.txt, funcionó a la perfección. Veamos qué pasa con file-7.txty file-9.txt.

Escribimos el siguiente comando:

unirse -1 1-2 2 archivo-7.txt archivo-9.txt

El "join -1 1-2 2 file-7.txt file-9.txt" en una ventana de terminal.

Solo emparejamos seis líneas. Las diferencias en letras mayúsculas y minúsculas impidieron que se unieran las otras dos direcciones de correo electrónico.

Sin embargo, podemos usar la -iopción (ignorar mayúsculas y minúsculas) para forzar joina ignorar esas diferencias y hacer coincidir campos que contienen el mismo texto, independientemente del caso.

Escribimos el siguiente comando:

unirse -1 1-2 2 -i archivo-7.txt archivo-9.txt

El comando "join -1 1 -2 2 -i file-7.txt file-9.txt" en una ventana de terminal.

Las ocho líneas se combinan y unen correctamente.

Mezclar y combinar

En  join, tiene un aliado poderoso cuando está luchando con una preparación de datos incómoda. Tal vez necesite analizar los datos, o tal vez esté tratando de darles forma para realizar una importación a un sistema diferente.

No importa cuál sea la situación, ¡se alegrará de tenerlo  joinen su esquina!