Eu tenho que juntar duas matrizes.
$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
Minha matriz real mat1
tem cerca de 20.000 colunas, portanto não é viável escrever 1,1 1,2 ..1,20,000 qual variação do -o
parâmetro pode ser usada para indicar todas as colunas da matriz uma e apenas uma coluna mat2
é necessária como a matriz mesclada final.
Responder1
Não existe essa opção 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.
Use cut
para selecionar as colunas apropriadas primeiro e depois unir:
join -t ' ' mat1 <(cut -f1,4 mat2)
(que é um caractere de tabulação entre aspas: Ctrl+ V, TAB),
ou para todas as colunas até 19999 mat1
você pode fazer:
cut -f-19999 mat1 | join -t ' ' - <(cut -f1,4 mat2)
Responder2
Uma maneira comum de lidar com tarefas como essa é usar awk
em vez de join
: primeiro construir uma matriz associativa a partir das entradas em um arquivo e, em seguida, procurar os valores correspondentes ao processar o outro arquivo, usando a coluna comum como chave. No seu caso por exemplo
$ 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