jueves, 4 de agosto de 2016

join

En algunos aspectos, join es como paste en cuanto a que añade columnas a un archivo, pero usa una forma única para hacerlo. Un join es una operación normalmente asociada con las bases de datos relacionales donde los datos de múltiples tablas con un campo clave compartido se combinan para dar el resultado deseado. El programa join realiza la misma operación. Une datos de múltiples archivos basándose en un campo clave compartido.

Para ver cómo se usa una operación join en una base de datos relacional, imaginemos una base de datos muy pequeña consistente en dos tablas, cada una con un único registro. La primera tabla, llamada CUSTOMERS, tiene tres campos: un número de cliente (CUSTNUM), el nombre del cliente (FNAME) y el apellido del cliente (LNAME):

CUSTNUM  FNAME  LNAME
======== =====  ======
4681934  John   Smith

La segunda tabla se llama ORDERS y contiene cuatro campos: un número de pedido (ORDER-NUM), el número de cliente (CUSTNUM), la cantidad (QUAN) y el producto pedido (ITEM).

ORDERNUM    CUSTNUM QUAN ITEM
========    ======= ==== ====
3014953305  4681934 1    Blue Widget

Fíjate que ambas tablas comparten el campo CUSTNUM. Esto es importante, ya que permite la relación entre las tablas.

Realizar una operación join nos permitiría combinar los campos en las dos tablas para conseguir un resultado útil, como preparar una factura. Usando los valores coincidentes en los campos CUSTNUM de ambas tablas, una operación join podría producir lo siguiente:

FNAME LNAME QUAN ITEM
===== ===== ==== ====
John  Smith 1    Blue Widget

Para probar el programa join, necesitaremos crear un par de archivos con una clave compartida. Para hacerlo, usaremos nuestro archivo distros-by-date.txt. Desde este archivo, construiremos dos archivos adicionales, uno conteniendo las fechas de lanzamiento (que será nuestra clave compartida para esta demostración) y los nombres de la versión:

[me@linuxbox ~]$ cut -f 1,1 distros-by-date.txt > distros-names.txt
[me@linuxbox ~]$ paste distros-dates.txt distros-names.txt > distros-key-names.txt
[me@linuxbox ~]$ head distros-key-names.txt
11/25/2008 Fedora
10/30/2008 Ubuntu
06/19/2008 SUSE
05/13/2008 Fedora
04/24/2008 Ubuntu
11/08/2007 Fedora
10/18/2007 Ubuntu
10/04/2007 SUSE
05/31/2007 Fedora
04/19/2007 Ubuntu

y el segundo archivo, que contiene las fechas de lanzamiento y los números de versión:

[me@linuxbox ~]$ cut -f 2,2 distros-by-date.txt > distros-vernums.txt
[me@linuxbox ~]$ paste distros-dates.txt distros-vernums.txt > distros-key-vernums.txt
[me@linuxbox ~]$ head distros-key-vernums.txt
11/25/2008 10
10/30/2008 8.10
06/19/2008 11.0
05/13/2008 9
04/24/2008 8.04
11/08/2007 8
10/18/2007 7.10
10/04/2007 10.3
05/31/2007 7
04/19/2007 7.04

Ahora tenemos dos archivos con una clave compartida (el campo "fecha de lanzamiento"). Es importante señalar que los archivos deben estar ordenados por el campo clave para que join funcione apropiadamente.

[me@linuxbox ~]$ join distros-key-names.txt distros-key-vernums.txt | head
11/25/2008 Fedora 10
10/30/2008 Ubuntu 8.10
06/19/2008 SUSE 11.0
05/13/2008 Fedora 9
04/24/2008 Ubuntu 8.04
11/08/2007 Fedora 8
10/18/2007 Ubuntu 7.10
10/04/2007 SUSE 10.3
05/31/2007 Fedora 7
04/19/2007 Ubuntu 7.04

Fíjate también que, por defecto, join usa el espacio en blanco como el delimitador de campos de entrada y un espacio individual como el delimitador de campos de salida. Este comportamiento puede modificarse especificando opciones. Mira la man page de join para más detalles.

No hay comentarios:

Publicar un comentario