Tengo que unir dos matrices.
$cat mat1
:
sample gen1 gen2 gen3 gen4
pt1 1 4 7 10
pt3 5 5 8 11
pt4 3 6 9 12
$cat mat2
:
sample age gender stage etc
pt0 5 m stage1 poi
pt1 6 f stage2 bmn
pt2 9 m stage3 yup
pt3 7 f stage4 qaz
pt4 6 f stage2 bmn
$join -o 1.1 1.2 1.3 1.4 2.4 mat1 mat2
:
sample gen1 gen2 gen3 stage
pt1 1 4 7 stage2
pt3 5 5 8 stage4
pt4 3 6 9 stage2
Mi matriz real mat1
tiene alrededor de 20.000 columnas, por lo que no es factible escribir 1.1 1.2 ..1.20,000 qué variación del -o
parámetro se puede usar para indicar todas las columnas de la matriz uno y solo mat2
se requiere una columna como matriz fusionada final.
Respuesta1
No existe tal opción para -o
(de man join
):
-o FORMAT
obey FORMAT while constructing output line
FORMAT is one or more comma or blank separated
specifications, each being `FILENUM.FIELD' or `0'. Default FORMAT
outputs the join field, the remaining fields from FILE1, the remaining
fields from FILE2, all separated by CHAR. If FORMAT is the keyword
'auto', then the first line of each file determines the number of
fields output for each line.
Utilice cut
para seleccionar las columnas apropiadas primero y luego unirlas:
join -t ' ' mat1 <(cut -f1,4 mat2)
(es un carácter de tabulación entre comillas: Ctrl+ V, TAB),
o para todas las columnas hasta 19999 mat1
puedes hacer:
cut -f-19999 mat1 | join -t ' ' - <(cut -f1,4 mat2)
Respuesta2
Una forma común de manejar tareas como esta es usar awk
en lugar de join
: primero construir una matriz asociativa a partir de las entradas de un archivo y luego buscar los valores correspondientes al procesar el otro archivo, usando la columna común como clave. En tu caso por ejemplo
$ awk 'NR==FNR {stage[$1]=$4; next;}; {print $0,stage[$1]}' mat2 mat1
sample gen1 gen2 gen3 gen4 stage
pt1 1 4 7 10 stage2
pt3 5 5 8 11 stage4
pt4 3 6 9 12 stage2