<Precedenti | Contenuti | Succ.>
join
In qualche modo, join è come incolla in quanto aggiunge colonne a un file, ma utilizza un modo unico per farlo. A join è un'operazione solitamente associata a database relazionali dove i dati provengono da più con tabelle con un campo chiave condiviso viene combinato per formare il risultato desiderato.
. join Il programma esegue la stessa operazione. Unisce i dati di più file in base a un campo chiave condiviso.
Per vedere come viene utilizzata un'operazione di join in un database relazionale, immaginiamo un database molto piccolo composto da due tabelle, ciascuna contenente un singolo record. La prima tabella, denominata CLIENTI, contiene tre campi: il numero del cliente (CUSTNUM), il nome del cliente (FNAME) e il cognome del cliente (LNAME):
CUSTNUM | NOME | LNOME |
======== | ===== | ====== |
4681934 | John | fabbro |
La seconda tabella si chiama ORDERS e contiene quattro campi: un numero d'ordine (ORDER-NUM), il numero del cliente (CUSTNUM), la quantità (QUAN) e l'articolo ordinato (ITEM).
NUMEROORDINE | CUSTNUM | QUAN | VOCE |
======== | ======= | ==== | ==== |
3014953305 | 4681934 | 1 | Widget blu |
Si noti che entrambe le tabelle condividono il campo CUSTNUM. Questo è importante, poiché consente una relazione tra le tabelle.
L'esecuzione di un'operazione di join ci consentirebbe di combinare i campi delle due tabelle per ottenere un risultato utile, come la preparazione di una fattura. Utilizzando i valori corrispondenti nei campi CUSTNUM di entrambe le tabelle, un'operazione di join potrebbe produrre quanto segue:
NOME | LNOME | QUAN | VOCE |
===== | ===== | ==== | ==== |
John | fabbro | 1 | Widget blu |
Per dimostrare il join programma, dovremo creare un paio di file con una chiave condivisa. Per fare questo, useremo il nostro distros-by-date.txt file. Da questo file, creeremo due file aggiuntivi, uno contenente le date di rilascio (che saranno la nostra chiave condivisa per questa dimostrazione) e i nomi dei rilasci:
[io@linuxbox~]$ cut -f 1,1 distros-by-date.txt > distros-names.txt [io@linuxbox~]$ incolla distros-dates.txt distros-names.txt > distros-key-names.txt
[io@linuxbox~]$ nomi-chiave-distro-head.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
[io@linuxbox~]$ cut -f 1,1 distros-by-date.txt > distros-names.txt [io@linuxbox~]$ incolla distros-dates.txt distros-names.txt > distros-key-names.txt
[io@linuxbox~]$ nomi-chiave-distro-head.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
10/04/2007 SUSE
05/31/2007 Fedora 04/19/2007 Ubuntu
e il secondo file, che contiene le date di rilascio e i numeri di versione:
[io@linuxbox~]$ cut -f 2,2 distros-by-date.txt > distros-vernums.txt [io@linuxbox~]$ incolla distros-dates.txt distros-vernums.txt > distro s-key-vernums.txt
[io@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 |
Ora abbiamo due file con una chiave condivisa (il campo "data di rilascio"). È importante sottolineare che i file devono essere ordinati in base al campo chiave per join per funzionare correttamente.
[io@linuxbox~]$ unisciti a 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
[io@linuxbox~]$ unisciti a 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
Si noti inoltre che, per impostazione predefinita, join utilizza uno spazio vuoto come delimitatore del campo di input e uno spazio singolo come delimitatore del campo di output. Questo comportamento può essere modificato specificando le opzioni. Vedere join pagina man per i dettagli.