파일이 있습니다 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'
.