# Join (Unix)

join è un comando dei sistemi operativi Unix e Unix-like, e più in generale dei sistemi POSIX, 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

La sintassi generale di join è la seguente:
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

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

Dati due file contenenti le linee che seguono
file1.txt (ordinato per il secondo campo):
file2.txt (ordinato per il primo campo):
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):
Come sopra, ma ordina diversamente i campi (opzione -o) e non include la sigla dello stato:
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:
Come sopra, ma visualizza solo i dati delle linee non corrispondenti di entrambi i file (opzioni -v 1 e -v 2 ):