Uma solução awk
:
$ awk 'NR==FNR{a[$2]=$3"\t"$4"\t"$5"\t"$6"\t"$7"\t"$8"\t"$9; next}
{
if($1 in a){
print $0,a[$1]
}
}' file2 file1
UN ID St M1 M2 SE DOF PV PA FC TID X E GG7 J O
17127159 0 -5.9 297.3 765.7 0.22 4 0.003 0.00389231 2.57536 16657436 353.568 335.295 221.717 815.654 684.85
17127163 2 -3.87 189.914 492.307 0.3548 4 0.0179 0.01795 2.59226 16657450 221.647 226.774 136.274 431.32 392.533
Explicação
O awk divide cada linha de entrada em campos (no espaço em branco, por padrão), fazendo com que o primeiro campo $1
seja o segundo $2
etc. A variável especial NR
é o número da linha de entrada atual e FNR
é o número da linha atual do arquivo que está sendo lido. Portanto, ao processar vários arquivos, os dois são iguais apenas enquanto o primeiro arquivo está sendo lido.
-
NR==FNR{a[$2]=$3"\t"$4"\t"$5"\t"$6"\t"$7"\t"$8"\t"$9; next}
: se estivermos lendo o primeiro arquivo, salve os campos 3 a 9 (unidos por tabulações) como o valor na matriza
cuja chave é o segundo campo. Em seguida, pule para a linhanext
. -
O
next
garante que o restante do script não seja executado para o primeiro arquivo (file2
), mas somente o segundo (file1
). -
if($1 in a){ print $0,a[$1] }
: agora estamos no segundo arquivo (file1
). Se o primeiro campo existir como uma chave na matriza
(if($1 in a)
), imprima a linha atual$0
e o valor armazenado ema
para$1
: campos 3 a 9 defile2
.