Ладно, я не могу понять, как это сделать.
У меня 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