join (Unix)
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.
Sintassi
[modifica | modifica wikitesto]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.
Opzioni
[modifica | modifica wikitesto]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.
Esempi
[modifica | modifica wikitesto]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
Note
[modifica | modifica wikitesto]Voci correlate
[modifica | modifica wikitesto]Collegamenti esterni
[modifica | modifica wikitesto]- (EN) join: Join lines on a common field, in GNU Coreutils manual. URL consultato il 15 agosto 2008.