2012-03-05 22 views
9

Me gustaría fusionar dos archivos por una columna en Unix.Fusionando dos archivos por una sola columna en Unix

tengo file_a:

subjectid name age 
12 Jane 16 
24 Kristen 90 
15 Clarke 78 
23 Joann 31 

tengo otra file_b:

subjectid prob_disease 
12 0.009 
24 0.738 
15 0.392 
23 1.2E-5 

me gustaría combinar estos archivos en la línea de comandos. Me gustaría fusionar los archivos ayb por subjectid. Como cada archivo tiene aproximadamente 2 millones de líneas, lo intenté en R pero se congeló debido a la cantidad de datos, ¿podría alguien ayudarme a hacer esto en Linux? salida deseada:

subjectid prob_disease name age 
12 0.009 Jane 16 
24 0.738 Kristen 90 
15 0.392 Clarke 78 
23 1.2E-5 Joanna 31  

Por favor, ayuda y gracias!

Respuesta

9

Echa un vistazo join(1). En su caso, usted ni siquiera necesita ninguna bandera:

$ join file_b file_a 
subjectid prob_disease name age 
12 0.009 Jane 16 
24 0.738 Kristen 90 
15 0.392 Clarke 78 
23 1.2E-5 Joann 31 
+2

Esto funciona muy bien, siempre y cuando las líneas ya están alineados por ID, si no, deberán ser ordenados. – Kevin

+0

... en cuyo caso también debe verificar ['sort (1)'] (http://linux.die.net/man/1/sort). –

+0

Iba a sugerir un truco awk con los dos archivos, pero join (1) es claramente la respuesta correcta aquí. Sin embargo, no es necesario ordenar previamente con awk. –

2

Usted está buscando el comando join:

$ cat test.1 
12 Jane 16 
24 Kristen 90 
15 Clarke 78 
23 Joann 31 
$ cat test.2 
12 0.009 
24 0.738 
15 0.392 
23 1.2E-5 
$ join -j1 -o 2.1,2.2,1.2,1.3 <(sort test.1) <(sort test.2) 
12 0.009 Jane 16 
15 0.392 Clarke 78 
23 1.2E-5 Joann 31 
24 0.738 Kristen 90 
$