Substitua campos de texto por valores de outro arquivo

3

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

Eu tenho um fileA que 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 tem um ID diferente.

Eu quero substituir o valor correspondente a RIMSclockBias_A string de cada estação por um valor que tenho em outro fileB , assim:

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 

Eu posso isolar o campo correto com uma combinação de grep em for loop e awk , mas não sei como posso substituir o valor no próprio arquivo. sed precisa saber o valor exato que quero substituir como entrada, por isso não é viável.

Alguma ideia?

    
por Dad85 23.05.2016 / 16:24

1 resposta

2

Isto está intimamente relacionado com outra questão apenas neste caso a substituição tem de ser feita na primeira linha que corresponda clockBias após o padrão. Se não houvesse nenhum caractere especial no seu fileB , você poderia executar com gnu sed :

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

Isso simplesmente transforma as linhas em seus comandos fileB into sed , por exemplo:

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

e depois passa para o segundo sed para processar fileA .

Com entrada desconhecida, você teria que escapar de qualquer caractere especial no LHS / RHS como expliquei na minha resposta à outra pergunta (dessa vez usando BRE sintaxe):

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