シェルスクリプトを使用してファイル名の特定の部分を取得し、ループに入れます。

シェルスクリプトを使用してファイル名の特定の部分を取得し、ループに入れます。

説明すると、.SACファイルは地震解析コード(SAC)プログラムで使用される地震記録の種類であり、* HHを含む他のファイルは応答ファイルです。 SACで実行できるデバイスの応答を削除したいです。コード1633、1703などの逆コードは3つのコンポーネントで構成されています。南北(N)、東西(E)、垂直(Z)。私のコードは一度に1つのサイトを作成します。したがって、応答ファイルの最初の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"部分を例として、シェルスクリプトの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?リストの3つのファイル)がない場合、メッセージは出力されsac実行されません。

$resp存在する場合は、sac表示されているのと同じスクリプトを使用して実行します。

ここでは、ドキュメントと終了区切りEND_SAC文字をインデントするためにリテラルタブを使用することに注意してください。私は<<-END_SACこの-記事の内容を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

関連情報