A maneira fácil é através de awk
- basta ler o segundo arquivo, salvar cada linha em uma matriz (onde o índice é $ 1) e ao ler o primeiro arquivo verificar se a linha já é um índice na matriz - em caso afirmativo substituir com o valor desse elemento:
awk -F: 'NR==FNR{z[$1]=$0;next}
($0 in z) {$0=z[$1]};1' file2 file1
Você pode fazer isso com join
também, mas isso requer mais trabalho (basicamente, numerar linhas no primeiro arquivo para poder classificar o resultado de join
e restaurar a ordem):
join -a 1 -t: -1 2 -2 1 <(nl -s: -ba -nrz file1 | sort -t: -k2,2) \
<(sort -t: -k1,1 file2) | sort -t: -k2,2 | cut -d: -f1,3-