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:
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