bash: intercambia números coincidentes, con nombres de usuario contenidos en un segundo archivo

bash: intercambia números coincidentes, con nombres de usuario contenidos en un segundo archivo

Quiero reemplazar el último número de cada línea en el "archivo 1", con el nombre de usuario correspondiente del "archivo 2", para obtener el resultado publicado.

archivo 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

archivo 2:

usuario5874
usuario2404
usuario81002
usuario4540
usuario1259
usuario6260
usuario7278
usuario366

esto es sólo una parte del "archivo 2". el archivo en realidad contiene muchos más usuarios.

resultado:

28/02/13 46.149002 usuario1
22/03/13 68.234001 usuario2
14/03/16 69.835007 usuario3
29/01/14 87.083008 usuario4
14/03/16 106.516006 usuario5
14/03/16 002 usuario6 12/03/12
207.521011 usuario7
18 /08/16 234.778015 usuario8

Respuesta1

Supongo que sus archivos tienen este formato estricto donde los espacios solo separan columnas (no hay espacio dentro de ningún nombre de usuario, etc.). Entonces esto debería funcionar (al menos en Linux, mi banco de pruebas es 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

Alguna explicación:

  1. El comando se lee desde file1( … <file1).
  2. Siempre que pueda leer una línea ( while read …)…
  3. …lo imprime ( printf …) con el tercer campo reemplazado por…
  4. … el efecto $( … )de …
    1. … buscando una línea que contenga el número dado dentro file2( grep …, tenga en cuenta el espacio inicial:) " $number"
    2. … donde sólo se toma el primer partido ( head …, por si acaso), …
    3. … y luego solo queda la primera columna ( cut …).

información relacionada