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 possui um ID diferente.
Quero substituir o valor correspondente à RIMSclockBias_A
string de cada estação por um valor que tenho em outra 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
Posso isolar o campo correto com uma combinação de grep
um for
loop e awk
, mas não sei como posso substituir o valor no próprio arquivo. sed
precisa 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 clockBias
após o padrão. Se não houvesse nenhum caractere especial no seu, fileB
você 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 fileB
em sed
comandos, por exemplo:
/CNR/,/clockBias/{/clockBias/{s/(:[[:blank:]]{1,})(.*)/\1-44163754.49/}}
e depois passa-os para o segundo sed
para 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