Берется определенная часть имени файла с помощью сценария оболочки и помещается в цикл.

Позвольте мне объяснить, файлы .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 в сценарии оболочки и сделать это процесс для всех файлов.

Заранее спасибо.

-4
24.06.2020, 11:12
2 ответа

Использование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.

2
18.03.2021, 23:25

Думаю, это могло бы помочь:

$ 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
0
18.03.2021, 23:25

Теги

Похожие вопросы