bash: trocando números correspondentes, com nomes de usuários contidos em um segundo arquivo

bash: trocando números correspondentes, com nomes de usuários contidos em um segundo arquivo

quero substituir o último número de cada linha no "arquivo 1" pelo nome de usuário correspondente do "arquivo 2" para obter o resultado postado.

arquivo 1:

28/02/13 46.149002259
22/03/13 68.234001404
14/03/16 69.83500766
29/01/14 87.083008540
14/03/16 106.516006874
14/03/16 201.552002260
12/03/12 207.521011278
18/08/16 234.7780151002

arquivo 2:

usuário5874
usuário2404
usuário81002
usuário4540
usuário1259
usuário6260
usuário7278
usuário366

esta é apenas uma parte do "arquivo 2". na verdade, o arquivo contém muito mais usuários.

resultado:

28/02/13 46.149002 usuário1
22/03/13 68.234001 usuário2
14/03/16 69.835007 usuário3
29/01/14 87.083008 usuário4
14/03/16 106.516006 usuário5
14/03/16 201.552 002 usuário6 12/03/12
207.521011 usuário7
18 /08/16 234.778015 usuário8

Responder1

Presumo que seus arquivos tenham esse formato estrito, onde os espaços separam apenas colunas (não há espaço dentro de nenhum nome de usuário, etc.). Então isso deve funcionar (pelo menos no Linux, meu ambiente de teste é o Kubuntu):

while read date value number ; do printf "%s %s %s\n" "$date" "$value" "$(grep " $number" file2 | head -n 1 | cut -f 1 -d " ")" ; done <file1

Alguma explicação:

  1. O comando lê de file1( … <file1).
  2. Contanto que possa ler uma linha ( while read …)…
  3. … imprime ( printf …) com o terceiro campo substituído por …
  4. … o efeito $( … )de …
    1. … procurando por uma linha contendo o número fornecido dentro de file2( grep …, observe o espaço inicial: " $number") …
    2. … onde apenas a primeira partida é realizada ( head …, por precaução), …
    3. … e então resta apenas a primeira coluna ( cut …).

informação relacionada