让我解释一下,.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”部分为例,并在 shell 脚本中与 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
,它-
告诉 shell 在将此处文档的内容输入到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