Header Ads Widget

Ticker

6/recent/ticker-posts

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

 

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 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 avarian0@newyorker.com Mujer 192.57.150.231
2 Nancee Merrell nmerrell1@ted.com Mujer 22.198.121.181
3 Herta Friett hfriett2@dagondesign.com Mujer 33.167.32.89
4 Torie Venmore tvenmore3@gmpg.org Mujer 251.9.204.115
5 Deni Sealeaf dsealeaf4@nps.gov Mujer 210.53.81.212
6 Fidel Bezley fbezley5@lulu.com Hombre 72.173.218.75
7 Ulrikaumeko Standen ustanden6@geocities.jp Mujer 4.204.0.237
8 Odell Jursch ojursch7@utexas.edu 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 avarian0@newyorker.com Mujer Oeste de Nueva York $ 535,304.73
2 Merrell nmerrell1@ted.com Finger Lakes hembra $ 309,033.10
3 Friett hfriett2@dagondesign.com Mujer Nivel Sur $ 461,664.44
4 Venmore tvenmore3@gmpg.org Mujer Central New York $ 175,818.02
5 Sealeaf dsealeaf4@nps.gov Mujer North Country $ 126,690.15
6 Bezley fbezley5@lulu.com Hombre Mohawk Valley $ 366,733.78
7 Standen ustanden6@geocities.jp Female Capital District $ 674,634.93
8 Jursch ojursch7@utexas.edu 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.

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 avarian0@newyorker.com Mujer 192.57.150.231 Varian avarian0@newyorker.com Mujer Oeste de Nueva York $ 535,304.73
2 Nancee Merrell nmerrell1@ted.com Mujer 22.198.121.181 Merrell nmerrell1@ted.com Mujer Finger Lakes $ 309,033.10
3 Herta Friett hfriett2@dagondesign.com Mujer 33.167.32.89 Friett hfriett2@dagondesign.com Mujer Nivel Sur $ 461,664.44
4 Torie Venmore tvenmore3@gmpg.org Mujer 251.9.204.115 Venmore tvenmore3@gmpg.org Mujer Central New York $ 175,818.02
5 Deni Sealeaf dsealeaf4@nps.gov Mujer 210.53.81.212 Sealeaf dsealeaf4@nps.gov Mujer North Country $ 126,690.15
6 Fidel Bezley fbezley5@lulu.com Hombre 72.173.218.75 Bezley fbezley5@lulu.com Hombre Mohawk Valley $ 366,733.78
7 Ulrikaumeko Standen ustanden6@geocities.jp Mujer 4.204.0.237 Standen ustanden6@geocities.jp Mujer Distrito Capital $ 674,634.93
8 Odell Jursch ojursch7@utexas.edu Hombre 1.138.85.117 Jursch ojursch7@utexas.edu 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.

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

1 Varian avarian0@newyorker.com Mujer Oeste de Nueva York $ 535,304.73
2 Merrell nmerrell1@ted.com Finger Lakes hembra $ 309,033.10
3 Friett hfriett2@dagondesign.com Mujer Nivel Sur $ 461,664.44
4 Venmore tvenmore3@gmpg.org Mujer Central New York $ 175,818.02
5 Sealeaf dsealeaf4@nps.gov Mujer North Country $ 126,690.15
8 Jursch ojursch7@utexas.edu Hombre Hudson Valley $ 663,821.09
6 Bezley fbezley5@lulu.com Hombre Mohawk Valley $ 366,733.78
7 Standen ustanden6@geocities.jp Female Capital District $ 674,634.93

Escribimos el siguiente comando para intentar unirse file-3.txtfile-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 avarian0@newyorker.com Mujer Oeste de Nueva York $ 535,304.73
2 Merrell nmerrell1@ted.com Finger Lakes hembra $ 309,033.10
3 Friett hfriett2@dagondesign.com Mujer Nivel Sur $ 461,664.44
4 Venmore tvenmore3@gmpg.org Mujer Central New York $ 175,818.02
5 Sealeaf dsealeaf4@nps.gov Mujer North Country $ 126,690.15
6 Bezley fbezley5@lulu.com Hombre Mohawk Valley $ 366,733.78
7 Standen ustanden6@geocities.jp 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:

avarian0@newyorker.com Mujer 192.57.150.231
dsealeaf4@nps.gov Mujer 210.53.81.212
fbezley5@lulu.com Hombre 72.173.218.75
hfriett2@dagondesign.com Mujer 33.167.32.89
nmerrell1@ted.com Mujer 22.198.121.181
ojursch7@utexas.edu Hombre 1.138.85.117
tvenmore3@gmpg.org Mujer 251.9.204.115
ustanden6@geocities.jp Mujer 4.204.0.237

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

Mujer avarian0@newyorker.com Oeste de Nueva York $ 535,304.73
Mujer dsealeaf4@nps.gov North Country $ 126,690.15
Hombre fbezley5@lulu.com Mohawk Valley $ 366,733.78
Mujer hfriett2@dagondesign.com Nivel Sur $ 461,664.44
Mujer nmerrell1@ted.com Finger Lakes $ 309,033.10
Hombre ojursch7@utexas.edu Hudson Valley $ 663,821.09
Mujer tvenmore3@gmpg.org Central New York $ 175,818.02
Mujer ustanden6@geocities.jp 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.

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.txtLa única diferencia es que algunas de las direcciones de correo electrónico tienen una letra mayúscula, como se muestra a continuación:

Mujer avarian0@newyorker.com Oeste de Nueva York $ 535,304.73
Mujer dsealeaf4@nps.gov North Country $ 126,690.15
Hombre Fbezley5@lulu.com Mohawk Valley $ 366,733.78
Mujer hfriett2@dagondesign.com Nivel Sur $ 461,664.44
Mujer nmerrell1@ted.com Finger Lakes $ 309,033.10
Hombre Ojursch7@utexas.edu Hudson Valley $ 663,821.09
Mujer tvenmore3@gmpg.org Central New York $ 175,818.02
Mujer ustanden6@geocities.jp Distrito Capital $ 674,634.93

Cuando nos unimos file-7.txtfile-8.txt, funcionó a la perfección. Veamos qué pasa con file-7.txtfile-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!

Publicar un comentario

0 Comentarios