説明すると、.SACファイルは地震解析コード(SAC)プログラムで使用される地震記録の種類であり、* HHを含む他のファイルは応答ファイルです。 SACで実行できるデバイスの応答を削除したいです。コード1633、1703などの逆コードは3つのコンポーネントで構成されています。南北(N)、東西(E)、垂直(Z)。私のコードは一度に1つのサイトを作成します。したがって、応答ファイルの最初の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?
リストの3つのファイル)がない場合、メッセージは出力され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