Substitua os campos de texto por valores de outro arquivo

Substitua os campos de texto por valores de outro arquivo

Tudo bem, não consigo descobrir como fazer isso.

Eu tenho um fileAque se parece com isso:

([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     

e assim por diante onde o [índice] vai de 0 a 71 e cada estação possui um ID diferente.

Quero substituir o valor correspondente à RIMSclockBias_Astring de cada estação por um valor que tenho em outra fileBassim:

CNR -44163754.49
ABS 3417370.112
...

Então, para ter:

([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 

Posso isolar o campo correto com uma combinação de grepum forloop e awk, mas não sei como posso substituir o valor no próprio arquivo. sedprecisa saber o valor exato que desejo substituir como entrada, portanto não é viável.

Qualquer ideia?

Responder1

Isto está intimamente relacionado comoutra perguntasomente neste caso a substituição deverá ser feita na primeira linha que corresponder clockBiasapós o padrão. Se não houvesse nenhum caractere especial no seu, fileBvocê poderia executar gnu sed:

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

Isso simplesmente transforma as linhas fileBem sedcomandos, por exemplo:

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

e depois passa-os para o segundo sedpara processar fileA.


Com entrada desconhecida, você teria que escapar de quaisquer caracteres especiais noLHS/RHScomo expliquei em minha resposta à outra pergunta (desta vez usandoBREsintaxe):

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

informação relacionada