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

Contenidos

Un indicador de terminal listo para un comando en un sistema Linux.

Si desea fusionar datos de dos archivos de texto haciendo coincidir un campo común, puede utilizar Linux join mando. 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. Al mismo tiempo de saber qué archivos abrir para hallar la información que desea, es probable que el diseño y el formato de los archivos sean diferentes.

Además tiene que 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.

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

La buena noticia es que si los archivos comparten al menos un elemento de datos común, Linux join El comando puede sacarte del fango.

Los archivos de datos

Todos los datos que usaremos para demostrar el uso de la join El comando es ficticio, comenzando con los siguientes dos archivos:

cat file-1.txt
cat file-2.txt

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

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

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

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

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

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

Cada línea en file-2.txt contiene la próxima información:

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

los join El comando 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 join para hacer coincidir las líneas entre los dos archivos, cada línea debe contener un campo común.

Por eso, 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, puesto que diferentes personas disponen el mismo apellido.

Tampoco puede vincular los datos con las entradas masculinas y femeninas, debido a que son demasiado vagas. Las regiones de Nueva York y los valores en dólares solo aparecen en un archivo además.

A pesar de esto, podemos utilizar la dirección de email debido a que está presente en ambos archivos y cada uno es único para un individuo. Un vistazo rápido a los archivos además confirma que las líneas en cada uno corresponden a la misma persona, por lo que podemos utilizar los números de línea como nuestro campo para hacer coincidir (usaremos un campo distinto más adelante).

Tenga en cuenta que hay una cantidad distinto de campos en los dos archivos, lo cual está bien, podemos decir join qué campo utilizar de cada archivo.

A pesar de esto, 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 disponen nombres de dos o tres palabras, en realidad tiene un número distinto 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. Por defecto, join utiliza el primer campo de un archivo, que es lo que queremos. Otro valor predeterminado sensato es que join espera que los separadores de campo sean espacios en blanco. De nuevo, tenemos eso, por lo tanto podemos seguir adelante y encender join.

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

join file-1.txt file-2.txt

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

El resultado es el siguiente:

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

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

Campos sin categorizar

Intentemos algo que sabemos que no funcionará. Pondremos las líneas en un archivo fuera de orden para join no podrá procesar el archivo correctamente. Los contenidos de file-3.txt son los mismos que file-2.txt, pero la línea ocho está entre las líneas cinco y seis.

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

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

Escribimos el siguiente comando para intentar unirnos file-3.txtpara file-1.txt:

join file-1.txt file-3.txt

join informa que la séptima línea en file-3.txt está 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.

Puedes utilizar el --check-order opción si pretendes ver si join está satisfecho con el orden de clasificación de los archivos; no se intentará combinarlos.

Para hacerlo, escribimos lo siguiente:

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

join le dice de antemano que habrá un obstáculo con la línea siete del archivo file-3.txt.

Archivos con líneas faltantes

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

1 Varian [email protected] Female Western New York $535,304.73
2 Merrell [email protected] Female Finger Lakes $309,033.10
3 Friett [email protected] Female Southern Tier $461,664.44
4 Venmore [email protected] Female Central New York $175,818.02
5 Sealeaf [email protected] Female North Country $126,690.15
6 Bezley [email protected] Male Mohawk Valley $366,733.78
7 Standen [email protected] Female Capital District $674,634.93

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

join file-1.txt file-4.txt

La salida enumera siete líneas fusionadas.

los -a La opción (imprimir no se puede emparejar) indica join para imprimir además las líneas que no pudieron coincidir.

Aquí, escribimos el siguiente comando para decirle join para imprimir las líneas del archivo uno que no pueden coincidir con las líneas del archivo dos:

join -a 1 file-1.txt file-4.txt

Siete líneas coinciden y la línea ocho del archivo uno se imprime, sin coincidencia. No hay información combinada debido a que file-4.txt no contenía una línea ocho con la que pudiera coincidir. A pesar de esto, al menos aún aparece en la salida para que sepa que no cuenta con una coincidencia en file-4.txt.

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

join -v file-1.txt file-4.txt

Vemos que la línea ocho es la única que no cuenta con 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] Female 192.57.150.231
[email protected] Female 210.53.81.212
[email protected] Male 72.173.218.75
[email protected] Female 33.167.32.89
[email protected] Female 22.198.121.181
[email protected] Male 1.138.85.117
[email protected] Female 251.9.204.115
[email protected] Female 4.204.0.237

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

Female [email protected] Western New York $535,304.73
Female [email protected] North Country $126,690.15
Male [email protected] Mohawk Valley $366,733.78
Female [email protected] Southern Tier $461,664.44
Female [email protected] Finger Lakes $309,033.10
Male [email protected] Hudson Valley $663,821.09
Female [email protected] Central New York $175,818.02
Female [email protected] Capital District $674,634.93

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

Escribimos lo siguiente para contar join para utilizar el primer campo en el archivo uno y el segundo en el archivo dos:

join -1 1 -2 2 file-7.txt file-8.txt

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

Uso de diferentes separadores de campo

¿Qué sucede si tiene archivos con campos 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:

cat file-5.txt
cat file-6.txt

Podemos utilizar el -t (carácter separador) para contar join qué carácter usar como separador de campo. En esta circunstancia, es la coma, por lo que escribimos el siguiente comando:

join -t, file-5.txt file-6.txt

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.txt, es casi idéntico a file-8.txt. La única diferencia es que algunas de las direcciones de email disponen una letra mayúscula, como se muestra a continuación:

Female [email protected] Western New York $535,304.73
Female [email protected] North Country $126,690.15
Male [email protected] Mohawk Valley $366,733.78
Female [email protected] Southern Tier $461,664.44
Female [email protected] Finger Lakes $309,033.10
Male [email protected] Hudson Valley $663,821.09
Female [email protected] Central New York $175,818.02
Female [email protected] Capital District $674,634.93

Cuando nos unimos file-7.txt y file-8.txt, funcionó estupendamente. Veamos que pasa con file-7.txt y file-9.txt.

Escribimos el siguiente comando:

join -1 1 -2 2 file-7.txt file-9.txt

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

A pesar de esto, podemos utilizar el -i (ignorar mayúsculas y minúsculas) opción para forzar join para ignorar esas diferencias y hacer coincidir los campos que contienen el mismo texto, independientemente del caso.

Escribimos el siguiente comando:

join -1 1 -2 2 -i file-7.txt file-9.txt

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 distinto.

No importa cuál sea la situación, se alegrará de tener join en tu esquina!

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.