2009-06-12 12 views
13

Ho due file dove voglio per eseguire l'operazione union sulla base di 1 ° colonna:Imbottitura Campo vuoto in Unix operazione di join

file1.txt

foo 1 
bar 2 
qux 3 

file2.txt

foo x 
qux y 
boo z 

Il risultato che spero di ottenere è il seguente:

foo 1 x 
bar 2 - 
qux 3 y 
boo - z 

dove i campi vuoti della colonna 1 sono riempiti con con "-".

Ma perché questo comando di join non funziona come mi aspettavo?

$ join -a1 -a2 -e"-" file1.txt file2.txt 

Qual è il modo giusto per farlo?

risposta

21

"Importante: FILE1 e FILE2 devono essere ordinati nei campi di join." (dalla manpage online this).

Questo problema n. Problema # 2 è peggio: l'opzione -e è mal documentato - funziona solo in combinazione con -o, così per esempio:

$ join -a 1 -a 2 -e'-' -o '0,1.2,2.2' sfile1.txt sfile2.txt 
bar 2 - 
boo - z 
foo 1 x 
qux 3 y 

dove il nome s prefisso del file che ho sort ed in anticipo indicato.

Modifica: man join spiega lo switch -o (così fa la manpage in linea che punto sopra). Specifica i campi da emettere (1.2 significa 2 ° campo dal file 1, & c), o 0 indica il campo di unione ed è un elenco separato da virgole. (Non ricordavo il valore 0, in realtà, quindi avevo originariamente fornito una soluzione più rozza che richiedeva l'awk post-processing, ma la soluzione corrente è migliore ... e non è necessario awk!).

+0

@alex: grazie tanto. Non capisco l'opzione "-o '1.1,2.1,1.2,2.2'". Dove posso trovare informazioni a riguardo? Anche se non ti dispiace l'awk per favore? – neversaint

+1

Ho modificato la risposta per spiegare -o, ma guardiamo a 'man awk': come ho fatto io, per verificare la mia spiegazione, mi è stato ricordato il valore 0 per il numero del campo, che ho usato ora nel esempio modificato e rende inutile la post-elaborazione. Ma ricordati di ordinare i tuoi file in anticipo! -) –

+0

@Alex, grazie mille. – neversaint

2

-e funziona solo con -o

join -a 1 -a 2 -e"-" -o auto file1.txt file2.txt