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 Linux join mando. Agrega una pizca de dinamismo a sus archivos de datos estáticos. Le 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, Linux join El comando puede sacarte del fango.

Los archivos de datos

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

|_+_| |_+_|



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

|_+_|Anuncio publicitario

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:

|_+_|

Cada línea en file-2.txt contiene 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 join El comando funciona con campos, lo 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 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.

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 exclusivo de una persona. 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).

Anuncio publicitario

Tenga en cuenta que hay un número diferente de campos en los dos archivos, lo cual está bien, podemos decir join qué 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 una cantidad 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. Por defecto, join usa 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. Una vez más, lo tenemos, así que podemos seguir adelante y encender join.

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

|_+_|

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

El resultado es el siguiente:

|_+_|

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 desordenadas, así que join no podrá procesar el archivo correctamente. El contenido de file-3.txt son lo mismo 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:

|_+_|Anuncio publicitario

Escribimos el siguiente comando para intentar unir file-3.txt a file-1.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.

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

Para hacerlo, escribimos lo siguiente:

|_+_|

join le informa 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 eliminó la última línea, por lo que no hay una línea ocho. Los contenidos son los siguientes:

|_+_|Anuncio publicitario

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

|_+_|

La salida enumera siete líneas fusionadas.

El -a La opción (imprimir no emparejable) dice join para imprimir también las líneas que no pudieron coincidir.

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

|_+_|

Siete líneas coinciden y la línea ocho del archivo uno está impresa, sin coincidencia. No hay información combinada porque file-4.txt no contenía una línea ocho con la que pudiera coincidir. Sin embargo, al menos sigue apareciendo en la salida para que sepa que no tiene una coincidencia en file-4.txt.

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

|_+_|

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:

|_+_|

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

|_+_|Anuncio publicitario

El único campo sensato que se puede usar 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 acomodar 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 de cada archivo debe usarse para unirse.

Escribimos lo siguiente para decirle join para usar el primer campo en el archivo uno y el segundo en el archivo dos:

|_+_|

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:

|_+_| |_+_|

Anuncio publicitario

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

|_+_|

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 correo electrónico tienen una letra mayúscula, como se muestra a continuación:

|_+_|

Cuando nos unimos file-7.txt y file-8.txt, funcionó perfectamente. Veamos qué sucede con file-7.txt y file-9.txt.

Escribimos el siguiente comando:

|_+_|

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.

Anuncio publicitario

Sin embargo, podemos usar el -i (ignorar mayúsculas y minúsculas) para forzar join para ignorar esas diferencias y hacer coincidir los campos que contienen el mismo texto, independientemente del caso.

Escribimos el siguiente comando:

|_+_|

Las ocho líneas se combinan y unen correctamente.

Mezclar y combinar

En join, tienes un aliado poderoso cuando estás 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 tener join en tu esquina!

Comandos de Linux
Archivos alquitrán · pv · gato · tac · chmod · sujeción · diff · sed · Con · hombre · empujado · popd · fsck · testdisk · seq · fd · pandoc · cd · $ RUTA · awk · entrar · jq · pliegue · uniq · journalctl · cola · Expresar · ls · fstab · echo · menos · chgrp · chown · Rdo · Mira · instrumentos de cuerda · escribe · rebautizar · Código Postal · abrir la cremallera · montar · desmontar · Instalar en pc · fdisk · mkfs · rm · rmdir · rsync · df · gpg · nosotros · nano · mkdir · desde · en · parche · convertir · rclone · desgarrar · SRM
Procesos alias · pantalla · cima · bonito · re bueno · Progreso · strace · sistema · tmux · chsh · historia · en · lote · gratis · cual · dmesg · usermod · ps · chroot · xargs · tty · meñique · lsof · vmstat · se acabó el tiempo · pared · · matar · dormir · sudo · su · hora · Groupadd · usermod · grupos · lshw · apagar · reiniciar · detener · apagado · passwd · lscpu · crontab · fecha · bg · fg
Redes netstat · silbido · trazar ruta · ip · ss · quién es · fail2ban · bmon · Uds · dedo · nmap · ftp · rizo · wget · quién · quién soy · En · iptables · ssh-keygen · ufw

RELACIONADO: Las mejores computadoras portátiles Linux para desarrolladores y entusiastas

LEER SIGUIENTE Foto de perfil de Dave McKay Dave McKay
Dave McKay usó computadoras por primera vez cuando la cinta de papel perforada estaba de moda, y ha estado programando desde entonces. Después de más de 30 años en la industria de las tecnologías de la información, ahora es un periodista de tecnología a tiempo completo. Durante su carrera, ha trabajado como programador autónomo, gerente de un equipo de desarrollo de software internacional, gerente de proyectos de servicios de TI y, más recientemente, como oficial de protección de datos. Su escrito ha sido publicado por howtogeek.com, cloudsavvyit.com, itenterpriser.com y opensource.com. Dave es un evangelista de Linux y un defensor del código abierto.
Leer biografía completa

Artículos De Interés