Shell-Script

使用 shell 腳本獲取文件名的特定部分並放入循環

  • June 24, 2020

讓我解釋一下,.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.

引用自:https://unix.stackexchange.com/questions/594598