![bash: intercambia números coincidentes, con nombres de usuario contenidos en un segundo archivo](https://rvso.com/image/1539555/bash%3A%20intercambia%20n%C3%BAmeros%20coincidentes%2C%20con%20nombres%20de%20usuario%20contenidos%20en%20un%20segundo%20archivo%20.png)
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:
- El comando se lee desde
file1
(… <file1
). - Siempre que pueda leer una línea (
while read …
)… - …lo imprime (
printf …
) con el tercer campo reemplazado por… - … el efecto
$( … )
de …- … buscando una línea que contenga el número dado dentro
file2
(grep …
, tenga en cuenta el espacio inicial:)" $number"
… - … donde sólo se toma el primer partido (
head …
, por si acaso), … - … y luego solo queda la primera columna (
cut …
).
- … buscando una línea que contenga el número dado dentro