설명하자면, .SAC 파일은 SAC(지진 분석 코드) 프로그램에서 사용하는 지진 기록 유형이고, *HH가 포함된 다른 파일은 응답 파일입니다. SAC에서 수행할 수 있는 기기 응답을 제거하고 싶습니다. 코드 1633, 1703 등 역 코드는 세 가지 구성 요소로 구성됩니다. 남북(N), 동서(E) 및 수직(Z). 내 코드는 한 번에 하나의 사이트를 만듭니다. 따라서 응답 파일의 처음 4자를 포함하는 SAC 파일 이름을 일치시키고 이를 반복하려고 합니다.
이와 같은 SAC 파일 이름이 많이 있습니다.
TK.1633..HNE.D.2017.163.122458.SAC
TK.1633..HNN.D.2017.163.122457.SAC
TK.1633..HNZ.D.2017.163.122458.SAC
TK.1703..HNE.D.2017.163.122457.SAC
TK.1703..HNN.D.2017.163.122456.SAC
TK.1703..HNZ.D.2017.163.122458.SAC
TK.3405..HNE.D.2017.163.122456.SAC
TK.3405..HNN.D.2017.163.122457.SAC
TK.3405..HNZ.D.2017.163.122457.SAC
TK.3406..HNE.D.2017.163.122457.SAC
TK.3406..HNN.D.2017.163.122458.SAC
TK.3406..HNZ.D.2017.163.122457.SAC
이것도 있어요;
1633.HHE
1633.HHN
1633.HHZ
1703.HHE
1703.HHN
1703.HHZ
3405.HHE
3405.HHN
3405.HHZ
3406.HHE
3406.HHN
3406.HHZ
나는 이 코드를 작성한다
for file in *TK.1633*HNE*
do
for response in 1633_HHE
do
sac << END
r $file
rmean
rtrend
transfer from polezero subtype $response to none
w ${file}_noresp
q
END
done
done
for file in *TK.1633*HNN*
do
for response in 1633.HHN
do
sac << END
r $file
rmean
rtrend
transfer from polezero subtype $response to none
w ${file}_noresp
q
END
done
done
for file in *TK.1633*HNZ*
do
for response in 1633.HHZ
do
sac << END
r $file
rmean
rtrend
transfer from polezero subtype $response to none
w ${file}_noresp
q
END
done
done
TK.1633..HNE.D.2017.163.122458.SAC "1633" 부분을 예로 들어 쉘 스크립트의 1633.HHE 파일과 일치시키고 모든 파일에 대해 이 프로세스를 수행하고 싶습니다.
미리 감사드립니다.
답변1
사용 bash
:
for name in TK.*.SAC; do
resp=${name#TK.} # remove initial TK.
resp=${resp%.D.*} # remove all from .D. onwards
resp=${resp/../.} # change .. into .
resp=${resp/N/H} # change first N into H
if [[ ! -f $resp ]]; then
printf 'Missing response file "%s" for "%s"\n' "$resp" "$name" >&2
continue
fi
sac <<-END_SAC
r $name
rmean
rtrend
transfer from polezero subtype $resp to none
w ${name}_noresp
q
END_SAC
done
그러면 모든 파일을 반복 TK.*.SAC
하고 해당 응답 파일의 이름을 계산합니다. SAC 파일에 i번째 응답 파일(예: 3419.HH?
예제 목록의 세 파일)이 누락된 경우 메시지가 출력되고 sac
실행되지 않습니다.
$resp
존재 하는 경우 sac
표시된 것과 동일한 스크립트를 사용하여 실행하십시오.
여기에서 문서와 종료 END_SAC
구분 기호를 들여쓰기 위해 리터럴 탭을 사용한다는 점에 유의하세요. 나는 <<-END_SAC
이 -
문서의 내용을 sac
.
답변2
이것은 내가 생각하는 데 도움이 됩니다:
$ for file in *.SAC
do
HHfile=$(echo $file | sed -e 's/TK.\([0-9]\+\)\.\.HN\(.\)\.D.*/\1\.HH\2/')
echo $HHfile
#Do whatever you want
done