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

0

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

arquivo 1:

28/02/13 46.149002 259
22/03/13 68.234001 404
14/03/16 69.835007 66
29/01/14 87.083008 540
14/03/16 106.516006 874
14/03/16 201.552002 260
03/12/12 207.521011 278
18/08/16 234.778015 1002

arquivo 2:

user5 874
user2 404
user8 1002
user4 540
user1 259
user6 260
user7 278
user3 66

isso é apenas uma parte do "arquivo 2". o arquivo realmente contém muito mais usuários.

resultado:

28/02/13 46.149002 user1
22/03/13 68.234001 user2
14/03/16 69.835007 user3
29/01/14 87.083008 user4
14/03/16 106.516006 user5
14/03/16 201.552002 user6
03/12/12 207.521011 user7
18/08/16 234.778015 user8

    
por fishxz 26.08.2017 / 21:01

1 resposta

2

Suponho que seus arquivos tenham esse formato restrito, em que espaços separam colunas (não há espaço dentro de nenhum nome de usuário, etc.). Então isso deve funcionar (pelo menos no Linux, meu testbed é 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

Algumas explicações:

  1. O comando lê a partir 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 correspondência é realizada ( head … , apenas no caso),…
    3. … e somente a primeira coluna é deixada ( cut … ).
por 26.08.2017 / 22:28

Tags