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!