join (Unix)

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca

join è un comando dei sistemi operativi Unix e Unix-like, e più in generale dei sistemi POSIX[1], che legge due file di testo le cui linee contengono dei dati separati in più campi, ed unisce tra loro quelle che hanno un determinato campo in comune, presentando il risultato sullo standard output. Le linee di dati di entrambi i file debbono essere prima ordinate in base al valore dei campi scelti per l'unione (ad esempio tramite il comando sort), altrimenti il risultato è indefinito.

Specificando le opzioni opportune è possibile usare join anche per ottenere le linee che non hanno corrispondenza, sia di un solo file che di entrambi, e sia in aggiunta che in sostituzione al normale output.

La sintassi generale di join è la seguente:

join [opzioni] [--] file1 file2

I parametri file1 e file2 specificano rispettivamente i nomi del primo e del secondo file di testo di cui unire le linee. Uno di essi può essere un trattino ("-") per indicare lo standard input.

Il doppio trattino -- (facoltativo) indica che i parametri successivi non sono da considerarsi opzioni.

Il comportamento predefinito prevede di usare come separatore di campo una serie di uno o più spazi, di unire le linee usando il primo campo di ciascun file e di mostrare per ogni corrispondenza trovata il campo in comune seguito dai rimanenti campi del primo file e dai rimanenti campi del secondo file.

Tra le opzioni principali vi sono:

-a 1
Oltre alle linee corrispondenti, include nel risultato anche le linee del primo file che non hanno corrispondenza nel secondo file.
-a 2
Oltre alle linee corrispondenti, include nel risultato anche le linee del secondo file che non hanno corrispondenza nel primo file.
-e stringa
Usa il valore indicato dal parametro stringa per i campi che altrimenti non avrebbero un valore definito (quando ad esempio sono usate le opzioni -a o -v).
-o campi
Specifica il formato del risultato: il parametro campi è una lista separata da virgole o da spazi di voci che indicano un campo, nella forma numero_file.numero_campo (ad esempio 1.3 indica il terzo campo del primo file, mentre 2.1 indica il primo campo del secondo file) oppure il valore speciale 0 per indicare il campo scelto per l'unione.
-t separatore
Usa il carattere indicato dal parametro separatore come separatore di campo sia per i file letti che per il risultato. Se non specificata, il separatore è una sequenza di uno o più spazi.
-v 1
Tralascia le linee corrispondenti tra i due file ed include nel risultato le linee del primo file che non hanno corrispondenza nel secondo file.
-v 2
Tralascia le linee corrispondenti tra i due file ed include nel risultato le linee del secondo file che non hanno corrispondenza nel primo file.
-1 numero_campo
Indica il numero del campo nel primo file (a partire da 1) da usare per unire i due file. Se non specificata, il comportamento predefinito prevede di usare il primo campo.
-2 numero_campo
Indica il numero del campo nel secondo file (a partire da 1) da usare per unire i due file. Se non specificata, il comportamento predefinito prevede di usare il primo campo.

Dati due file contenenti le linee che seguono

file1.txt (ordinato per il secondo campo):

Werner Herzog;de;1942
Wim Wenders;de;1945
Pedro Almodovar;es;1949
François Truffaut;fr;1932
Jean-Luc Godard;fr;1930
Sergio Leone;it;1929
Alfred Hitchcock;uk;1899
Stanley Kubrick;us;1928

file2.txt (ordinato per il primo campo):

ch;Svizzera
de;Germania
es;Spagna
fr;Francia
it;Italia
uk;Regno Unito

Unisce i dati dei registi ai nomi estesi delle loro nazioni (notare che Stanley Kubrick è escluso in quanto gli Stati Uniti d'America non sono elencati nel secondo file):

$ join -t ";" -1 2 -2 1 file1.txt file2.txt
de;Werner Herzog;1942;Germania
de;Wim Wenders;1945;Germania
es;Pedro Almodovar;1949;Spagna
fr;François Truffaut;1932;Francia
fr;Jean-Luc Godard;1930;Francia
it;Sergio Leone;1929;Italia
uk;Alfred Hitchcock;1899;Regno Unito

Come sopra, ma ordina diversamente i campi (opzione -o) e non include la sigla dello stato:

$ join -t ";" -1 2 -2 1 -o 2.2,1.3,1.1 file1.txt file2.txt
Germania;1942;Werner Herzog
Germania;1945;Wim Wenders
Spagna;1949;Pedro Almodovar
Francia;1932;François Truffaut
Francia;1930;Jean-Luc Godard
Italia;1929;Sergio Leone
Regno Unito;1899;Alfred Hitchcock

Come sopra, ma include anche i dati delle linee non corrispondenti di entrambi i file (opzioni -a 1 e -a 2), usando la stringa n.d. (opzione -e) in sostituzione dei valori non definiti:

$ join -t ";" -1 2 -2 1 -o 2.2,1.3,1.1 -e "n.d." -a 1 -a 2 file1.txt file2.txt
Svizzera;n.d.;n.d.
Germania;1942;Werner Herzog
Germania;1945;Wim Wenders
Spagna;1949;Pedro Almodovar
Francia;1932;François Truffaut
Francia;1930;Jean-Luc Godard
Italia;1929;Sergio Leone
Regno Unito;1899;Alfred Hitchcock
n.d.;1928;Stanley Kubrick

Come sopra, ma visualizza solo i dati delle linee non corrispondenti di entrambi i file (opzioni -v 1 e -v 2 ):

$ join -t ";" -1 2 -2 1 -o 2.2,1.3,1.1 -e "n.d." -v 1 -v 2 file1.txt file2.txt
Svizzera;n.d.;n.d.
n.d.;1928;Stanley Kubrick
  1. ^ (EN) join, in The Open Group Base Specifications Issue 6 IEEE Std 1003.1, 2004 Edition. URL consultato il 15 giugno 2008.

Voci correlate

[modifica | modifica wikitesto]

Collegamenti esterni

[modifica | modifica wikitesto]
  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica