한 파일의 특정 줄을 다른 파일의 특정 줄 끝에 추가하는 방법은 무엇입니까? (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_ratesupermaster.PRM의 줄 시작 부분에서 " " 텍스트를 검색하고 head -1첫 번째 결과만 가져옵니다. 그런 다음 이 출력은 이전 줄과 연결됩니다. 그런 다음 파일을 디스크에 저장하고 종료합니다.

원시 텍스트의 추가 공백이 문제인 경우 셸 코드를 약간 수정하여 압축할 수 있습니다.

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

sed... 1개 이상의 공백을 하나의 공백으로 바꾸는 명령을 추가할 뿐입니다 . 등호 뒤에 추가 공백이 나타날 수 있는 경우 sed 명령을 다음으로 변경합니다 sed 's/ */ /g'.

관련 정보