Sustituir campos de texto con valores de otro archivo

Sustituir campos de texto con valores de otro archivo

Muy bien, no puedo entender cómo hacer esto.

Tengo uno fileAque se parece a esto:

([7]RIMS_ID)                                            : "CNR"       
(refGain_A[7])                                          : 1           
(RIMSclockBias_A[7])                                    : -398015316.7
(RIMSclockDrift_A[7])                                   : -6442.29    
(RIMSclockSigma_A[7])                                   : .01         
(RIMSclockSigY_A[7])                                    : 0        

([8]RIMS_ID)                                            : "ABS"       
(refGain_A[8])                                          : 1           
(RIMSclockBias_A[8])                                    : -374515458
(RIMSclockDrift_A[8])                                   : -6442.29    
(RIMSclockSigma_A[8])                                   : .01         
(RIMSclockSigY_A[8])                                    : 0     

y así sucesivamente donde el [índice] va de 0 a 71 y cada estación tiene un ID diferente.

Quiero reemplazar el valor correspondiente a RIMSclockBias_Ala cadena de cada estación por un valor que tengo en otra fileBcomo esta:

CNR -44163754.49
ABS 3417370.112
...

Entonces tener:

([7]RIMS_ID)                                            : "CNR"       
(refGain_A[7])                                          : 1           
(RIMSclockBias_A[7])                                    : -44163754.49
(RIMSclockDrift_A[7])                                   : -6442.29    
(RIMSclockSigma_A[7])                                   : .01         
(RIMSclockSigY_A[7])                                    : 0        

([8]RIMS_ID)                                            : "ABS"       
(refGain_A[8])                                          : 1           
(RIMSclockBias_A[8])                                    : 3417370.112
(RIMSclockDrift_A[8])                                   : -6442.29    
(RIMSclockSigma_A[8])                                   : .01         
(RIMSclockSigY_A[8])                                    : 0 

Puedo aislar el campo correcto con una combinación de grepen un forbucle y awk, pero no sé cómo puedo reemplazar el valor en el archivo. sedNecesita saber el valor exacto que quiero reemplazar como entrada, por lo que no es factible.

¿Alguna idea?

Respuesta1

Esto está estrechamente relacionado conotra preguntasólo en este caso la sustitución debe realizarse en la primera línea que coincida clockBiasdespués del patrón. Si no hubiera ningún carácter especial en tu, fileBpodrías ejecutar con gnu sed:

sed -E 's|(.*)[[:blank:]](.*)|/\1/,/clockBias/{/clockBias/{s/(:[[:blank:]]{1,})(.*)/\\1\2/}}|' fileB | sed -Ef - fileA

Eso simplemente convierte las líneas en fileBcomandos sed, por ejemplo:

/CNR/,/clockBias/{/clockBias/{s/(:[[:blank:]]{1,})(.*)/\1-44163754.49/}}

y luego los pasa al segundo sedpara procesarlos fileA.


Con una entrada desconocida, tendrías que escapar de cualquier carácter especial en elLHS/RHScomo expliqué en mi respuesta a la otra pregunta (esta vez usandoBREsintaxis):

sed 's|\(.*\)[[:blank:]]\{1,\}\(.*\)|\1\
\2|
h
s|.*\n||
s|[\&/]|\\&|g
x
s|\n.*||
s|[[\.*^$/]|\\&|g
G
s|\(.*\)\n\(.*\)|/\1/,/clockBias/{/clockBias/{s/\\(:[[:blank:]]\\{1,\\}\\)\\(.*\\)/\\1\2/}}|' fileB | sed -f - fileA

información relacionada