Как добавить определенную строку в файле в конец определенной строки в другом файле? (возможно, используйте sed)

Как добавить определенную строку в файле в конец определенной строки в другом файле? (возможно, используйте sed)

У меня есть файл supermaster.PRM:

num_valid_az    = 12194 
nrows           = 12194 
first_line          = 1 
deskew          = n 
caltone         = 0.000000 
st_rng_bin          = 1 
Flip_iq         = n 
offset_video    = n 
az_res          = 0.000000 
nlooks          = 1 
chirp_ext           = 0 
scnd_rng_mig    = 0 
rng_spec_wgt    = 1.000000 
rm_rng_band         = 0.200000 
rm_az_band          = 0.000000 
rshift          = -18 
ashift          = 0 
stretch_r           = 0 
stretch_a           = 0 
a_stretch_r     = 0 
a_stretch_a     = 0 
first_sample    = 284 
SC_identity         = 10 
rng_samp_rate       = 64345238.125714 
input_file      = S1_20160114_ALL_F1.raw 
num_rng_bins        = 67752 
bytes_per_line      = 271008 
good_bytes_per_line = 271008 
PRF         = 486.486310 
pulse_dur       = 5.240481e-05 
near_range      = 799926.599409 
num_lines       = 12194 
num_patches     = 1 
SC_clock_start      = 2016013.0823712260 
SC_clock_stop       = 2016013.0826613354 
clock_start     =  13.082371226227 
clock_stop          =  13.082661335643 
led_file        = S1_20160114_ALL_F1.LED 
orbdir  = A 
lookdir = R 
radar_wavelength    = 0.0554658 
chirp_slope = 1.07815e+12 
rng_samp_rate       = 64345238.125714 
I_mean          = 0 
Q_mean          = 0 
SC_vel          = 7160.742699 
earth_radius        = 6371038.614500 
equatorial_radius   = 6378137.000000 
polar_radius        = 6356752.310000 
SC_height       = 699860.307600 
SC_height_start = 699988.203956 
SC_height_end   = 699732.953774 
fd1         = 0.000000 
fdd1            = 0.000000 
fddd1           = 0.000000 
sub_int_r               = 0.000000 
sub_int_a               = 0.000000 
SLC_file               = S1_20160114_ALL_F1.SLC 
dtype           = a 
SLC_scale               = 1.000000 

В этом файле supermaster.PRM я хочу взять «rng_samp_rate = 64345238.125714» — я знаю, что их два, но мне нужен только один — и поместить его в этот скрипт оболочки:

#!/bin/bash
#SBATCH --job-name=InSAR
#SBATCH --ntasks=128
#SBATCH --time=7-00:00:00
#SBATCH --mail-type=fail,end
#SBATCH --export=all
#SBATCH --out=Forge-%j.out
#SBATCH --mem=256000

module load GMT
module load GMTSAR
module load parallel
sbas intf.tab scene.tab 19 10 8469 6097 
csh plot_sbas.csh

до конца линии sbas как

#!/bin/bash
#SBATCH --job-name=InSAR
#SBATCH --ntasks=128
#SBATCH --time=7-00:00:00
#SBATCH --mail-type=fail,end
#SBATCH --export=all
#SBATCH --out=Forge-%j.out
#SBATCH --mem=256000

module load GMT
module load GMTSAR
module load parallel
sbas intf.tab scene.tab 19 10 8469 6097 -rng_samp_rate = 64345238.125714
csh plot_sbas.csh

решение1

Вы можете использовать этот awkскрипт:

awk 'NR==FNR && /^rng_samp_rate/ { value=$0 } 
     NR!=FNR && !/^sbas/         { print }
     NR!=FNR && /^sbas/          { print $0 " -" value }' supermaster.PRM script.in > script.out

Первый файл должен быть файлом параметров, второй файл — скриптом оболочки, который необходимо изменить. (Этот awkскрипт берет последнее вхождение rng_samp_rate.)

Выходной сигнал:

#!/bin/bash
#SBATCH --job-name=InSAR
#SBATCH --ntasks=128
#SBATCH --time=7-00:00:00
#SBATCH --mail-type=fail,end
#SBATCH --export=all
#SBATCH --out=Forge-%j.out
#SBATCH --mem=256000

module load GMT
module load GMTSAR
module load parallel
sbas intf.tab scene.tab 19 10 8469 6097  -rng_samp_rate       = 64345238.125714 
csh plot_sbas.csh

Конечно, вы также можете использовать другие инструменты, такие как grepи sed.

sed "s/^sbas.*/& -$(grep '^rng_samp_rate' supermaster.PRM|head -1)/" script.in > script.out

или, может быть, немного легче понять

#! /bin/sh
VALUE="$(grep '^rng_samp_rate' supermaster.PRM|head -1)"
sed "s/^sbas.*/& -$VALUE/" script.in > script.out

(Здесь я использую первое вхождение rng_samp_rate.)

Обе команды предполагают, что никакие другие строки не начинаются с rng_samp_rateили sbasи что файл параметров всегда содержит rng_samp_rateстроку. sedСкрипт предполагает, что строка значений из файла параметров не содержит /.


Редактировать: Как изменить файл скрипта вместо создания нового выходного файла?

Некоторые команды, например sed, поддерживают редактирование на месте, которое можно использовать для изменения файла скрипта без явного создания отдельного выходного файла.

sed  -i .bak -e "some script" script.in

В общем случае вы всегда можете последовать за командой подходящей mvкомандой, например:

awk 'some script' supermaster.PRM script.in > script.out && mv script.out script.in

Это &&гарантирует, что ваш исходный скрипт будет перезаписан только в том случае, если awkкоманда не выдала ошибку.

Если вы хотите внести больше изменений, вы можете расширить awkскрипт sed(наилучшая производительность) или запустить несколько скриптов последовательно или подключив их к каналу. (Для получения подробной информации вам следует написать дополнительные требования.)

решение2

Вы можете написать этот скрипт так ed:

printf '%s\n' \
  '/^sbas /s/$/ -/' \
  '. r !grep ^rng_samp_rate supermaster.PRM | head -1' \
  '-1,.j' \
  'w' \
  'q' | ed -s shellscript

Это изменяет (первую) строку, которая начинается с текста " sbas", чтобы добавить пробел и тире. Затем она считывает вывод из команды оболочки в следующую строку; команда оболочки ищет текст " rng_samp_rate" в начале строки в supermaster.PRM, затем использует head -1для захвата только первого такого результата. Затем этот вывод объединяется с предыдущей строкой. Затем мы сохраняем файл на диск и выходим.

Если дополнительные пробелы в исходном тексте представляют проблему, вы можете их сократить, слегка изменив код оболочки:

...
grep ^rng_samp_rate supermaster.PRM | head -1 | sed 's/  */ /'
...

... которая просто добавляет sedкоманду, которая заменяет 1 или более пробелов на один пробел. Если после знака равенства могут быть дополнительные пробелы, измените команду sed на: sed 's/ */ /g'.

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