使用 shell 脚本获取文件名的特定部分并放入循环中

使用 shell 脚本获取文件名的特定部分并放入循环中

让我解释一下,.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

相关内容