Позвольте мне объяснить, файлы .SAC являются типом сейсмограмм, которые использует программа SAC (код сейсмического анализа), а другие файлы, содержащие *HH, являются ответными файлами. Я хочу удалить ответ на запрос, который может сделать SAC. код 1633 1703 и т. д. Коды станций, которые состоят из трех компонентов. Север-юг (N), восток-запад (E) и вертикаль (Z). Мой код делает одну станцию сразу. Поэтому я просто хочу сопоставить имена файлов SAC, которые содержат первые 4 символа файлов ответов, и зациклить их.
У меня есть много таких имен файлов для 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 в сценарии оболочки и сделать это процесс для всех файлов.
Заранее спасибо.
Использование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
, и именно -
сообщает оболочке удалить начальные вкладки из содержимого документа здесь -перед тем, как передать его в sac
.
Думаю, это могло бы помочь:
$ 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