Intereting Posts
Как добавить текст с возможностью поиска к изображению? Когда родители, дети и внуки разделяют страницу, как работает копирование на запись? Как построить встроенный в беспроводную сеть встроенный ядро? Пул NTP содержит только записи IPv4? Все подпроцессы – Bash (!), Как изменить размеры разделов и файловых систем на них? Что случилось с файлом, когда я ввел «mv file.txt ../»? Может ли «apt-get -s upgrade» или какая-либо другая команда apt указать список репозиториев, из которых будут загружены пакеты? создать raid1 из существующего локального объема lvm Samba – Не удается записать в share с "unix extensions = no", установленным в smb.conf Bash – нет такого файла или каталога, даже если каталог существует и предыдущие команды выполняются правильно Есть ли команда, чтобы увидеть, где установлен диск? Не удается установить заголовки Linux на Debian 6 Обработать файл, который начинается с спецификации (FF FE) Не удается обновить Scientific Linux до версии 6.5

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

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

У меня есть 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 должен знать точное значение, которое я хочу заменить в качестве входного сигнала, поэтому это невозможно.

Есть идеи?

Это тесно связано с другим вопросом только в этом случае замена должна быть сделана в первой строке, которая соответствует 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


С неизвестным входом вам придется избегать каких-либо специальных символов в LHS / RHS, как я объяснил в ответе на другой вопрос (на этот раз с использованием синтаксиса BRE ):

 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