쉘 스크립트를 사용하여 파일 이름의 특정 부분을 가져와 루프에 넣습니다.

쉘 스크립트를 사용하여 파일 이름의 특정 부분을 가져와 루프에 넣습니다.

설명하자면, .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

관련 정보