プログラムがcshellのループで動作するときに新しいファイル名をどのように指定しますか?

プログラムがcshellのループで動作するときに新しいファイル名をどのように指定しますか?

.datファイルがたくさんありますが、これを.sacファイル(一種の地震計ファイル)に変換したいと思います。 xy2sacプログラムを使用してファイルを変換しましたが(コードを作成しませんでした)、変換されたファイルに新しい名前を付ける必要がありました。

コンバータコードは次のように動作します。

xy2sac filename.dat newfilename.sac

私がやりたいことは、xy2sacプログラムがループで動作している間に新しいファイル名を指定することです。たとえば、私のdatファイル名は次のようになります。

BRGA_KO_disp_post_mij_conv0000_E.dat
BRGA_KO_disp_post_mij_conv0000_E.dat
BRGA_KO_disp_post_mij_conv0000_N.dat
BRGA_KO_disp_post_mij_conv0000_Z.dat
GADA_KO_disp_post_mij_conv0000_E.dat
GADA_KO_disp_post_mij_conv0000_N.dat
GADA_KO_disp_post_mij_conv0000_Z.dat
HYBL_KO_disp_post_mij_conv0000_E.dat
HYBL_KO_disp_post_mij_conv0000_N.dat
HYBL_KO_disp_post_mij_conv0000_Z.dat
ISK_KO_disp_post_mij_conv0000_E.dat
ISK_KO_disp_post_mij_conv0000_N.dat
ISK_KO_disp_post_mij_conv0000_Z.dat
TUZL_KO_disp_post_mij_conv0000_E.dat
TUZL_KO_disp_post_mij_conv0000_N.dat
TUZL_KO_disp_post_mij_conv0000_Z.dat

名前を次に変更したいです。

BRGA_KO__E.sac
BRGA_KO__E.sac
BRGA_KO__N.sac
BRGA_KO__Z.sac
GADA_KO__E.sac
GADA_KO__N.sac
GADA_KO__Z.sac
HYBL_KO__E.sac
HYBL_KO__N.sac
HYBL_KO__Z.sac
ISK_KO__E.sac
ISK_KO__N.sac
ISK_KO__Z.sac
TUZL_KO__E.sac
TUZL_KO__N.sac
TUZL_KO__Z.sac

だから.datの前の最初の8文字と最後の文字を選択したいと思います。

どうすればいいですか?

このループを使用しましたが、うまくいかず、最終的に.datファイル拡張子ができました。

foreach file (`ls *.dat*`)
xy2sac *.dat *.sac << END
END
end

よろしくお願いします。

答え1

cshより正常なシェルに変更:sできない場合

前任者。

#!/bin/csh -f

foreach file ( *.dat )
echo xy2sac $file $file:s/disp_post_mij_conv0000//:s/.dat/.sac/
end

echoファイル名が正しいと確信している場合は、削除してください。

答え2

警告:私はあなたがcshを使用していることを知らなかったので、私の答えはbashにのみ適用されます。これがオプションでない場合は、他の回答で利用可能なソリューションを提供します。

=~配列と共に演算子を使用してBASH_REMATCHファイル名の一部を一致させ、それを新しいファイル名に結合することができます。

#!/bin/bash
for file in *.dat
do
    if [[ $file =~ ([A-Z]+_[A-Z]+_).*(..)\.dat ]]
    then
        xy2sac $file ${BASH_REMATCH[1]}${BASH_REMATCH[2]}.dac
    fi
done

しかし、要件と例が一致していることを確認する必要があり、実際に何を意味するのかを推測する必要はありません。実際、コマンドに空のhere文書を入力する必要があるかどうかはわかりません。あなたの例と一致するようにコードを書いたが、一致する最初の部分は常に8文字ではなく、_最後の文字だけでなく、.dat(含む)の前の最後の2文字を意味しました。

答え3

1つの提案:awkを使用して「_」と「.」を簡単に切り取り、新しいファイル名を作成したい部分に簡単にアクセスします。

あなたならどうでしょうか?確かにすべての* .datファイルには、言及した正確な構造があります(たとえば、スペースがなく、常に6つの「_」、1つの「.」のみがあるなど)。

# solution with awk, which can easily define fields using a regex
# (here: "[_.]" so that either 1 "_" or 1 "." separates one field from the next)
# awk will check we presented a filename with the correct number of fields, and also

cd /correct/directory || exit 1   # ie, go to the right directory containing your .dat files, or exit
find ./ -name '*.dat' -print \
  | awk -F'[_.]' -v nbfield=8 '
       ( NF != nbfield ) {
           print "Error: file " $0 " ignored: does not have the right structure." ; 
           next;
       }
       ( NF == nbfield ) { 
           print "converting file: " $0 " ..."
           system("echo _remove_echo_when_ok_ xy2sac  " $0 "  " $1"_"$2"__"$(NF-1)".sac && echo OK || echo ___ko___ ") 
       }
     '

もちろん、それがうまくいくと思ったら:("echo _remove_echo_when_ok_ xy2sac "表示するだけでxy2sacを実行しません)を"xy2sac "(実行します)に置き換えます。

関連情報