Uma solução simples é usar o comando join para realizar isso.
Isso requer que os dois arquivos sejam classificados , pois join só funciona nesses casos ... Você pode usar sort para ordenar os ficheiros, se não estiverem ordenados.
Ele também assume que o número de campos no primeiro arquivo (aquele que você deseja imprimir) é fixo, já que você precisa especificar os campos de saída um por um.
Esta solução também pressupõe que você está OK com a alteração do espaço em branco entre os campos da solução. E que você está OK com o resultado final sendo classificado (e não necessariamente preservando a ordem do arquivo1), se o arquivo1 não foi classificado para começar com ...
Então, supondo que você esteja bem com essas restrições, tudo que você precisa fazer é:
$ join -o 1.1,1.2,1.3,1.4,1.5 file1 file2
A 54 54 67 abcd
D 43 2 22.2 asdasd
Se os arquivos não estiverem classificados, uma abordagem simples é usar substituição do processo bash para ordená-los on-the-fly e alimentá-los para join :
$ join -o 1.1,1.2,1.3,1.4,1.5 <(sort file1) <(sort file2)
(Embora se os arquivos forem grandes e possuírem milhões de linhas, talvez você queira armazenar os resultados classificados, para não ter que classificar novamente.)
Uma pequena nota de que isso depende da sua localidade (que define a ordem de classificação), você também pode querer passar a opção sort the -b para pular espaços em branco se você tiver isso em seus arquivos ... de join também sugere usar sort -k 1b,1 e também discute o uso de LC_COLLATE para controlar a ordem na ordenação e participar ... Espero que seja um bom começo para resolver essa questão!