Shell-Script
使用 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 文件進行匹配,並對所有文件進行此處理。
提前致謝。
使用
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 文件缺少第一個響應文件,3419.HH?
例如範例列表中的三個文件,則會輸出一條消息並且sac
不會執行。如果
$resp
存在,sac
則使用您顯示的相同腳本執行。請注意使用文字製表符來縮進此處的文件及其終止
END_SAC
分隔符。我正在使用<<-END_SAC
它,-
它告訴 shell 在將其輸入sac
.