Заменить текстовые поля значениями из другого файла

Заменить текстовые поля значениями из другого файла

Ладно, я не могу понять, как это сделать.

У меня fileAэто выглядит примерно так:

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

и так далее, где [индекс] идет от 0 до 71, и каждая станция имеет свой идентификатор.

Я хочу заменить значение, соответствующее RIMSclockBias_Aстроке каждой станции, на значение, которое у меня есть на другой станции, fileBнапример так:

CNR -44163754.49
ABS 3417370.112
...

Итак, чтобы иметь:

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

Я могу выделить правильное поле с помощью комбинации grepв forцикле и awk, но я не знаю, как заменить значение в самом файле. sedМне нужно знать точное значение, которое я хочу заменить в качестве входных данных, поэтому это невыполнимо.

Есть идеи?

решение1

Это тесно связано сДругой вопростолько в этом случае замена должна быть сделана в первой строке, которая совпадает clockBiasпосле шаблона. Если в вашем нет специального символа, fileBвы можете запустить с помощью gnu sed:

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

Это просто преобразует строки в ваши fileBкоманды sed, например:

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

а затем передает их второму sedдля обработки fileA.


При неизвестном вводе вам придется экранировать все специальные символы вЛевая/правая сторонакак я уже объяснил в своем ответе на другой вопрос (на этот раз используяБРЭсинтаксис):

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

Связанный контент