複数のファイルに対してスクリプトを繰り返すには?

複数のファイルに対してスクリプトを繰り返すには?

Gnuplotスクリプトがあります(EXE)、このスクリプトで私が提供したX_001いくつかの関数によって描かれた入力ファイルとして出力ファイルを提供します。X_001.png。入力ファイルと出力ファイルの名前を手動で入力すると正常に動作します。ファイルに対してこのスクリプトを繰り返しようとしています。{X_001..X_300} 私はこのループを書いた。

for i in X_*; do sed -i 's/X_*/${i}/g' exe ; ./exe ; done

しかし、これは役に立ちません。

ここで状況が変わりますexeスクリプトを書く必要がある

set term png size 1600,1200
set output "X_001.png"
splot 'X_001'

答え1

私はBashスクリプトを使用することを好みますgnuplot。ファイルをデータとして使用してみてください。したがって、データファイルがあり、次のようにプロットしようとしているとします。X_*X_*.pngX_*.outX_*.png

#!/bin/bash
export LANG=C LC_ALL=C

for data in X_*.out ; do
    [ -r "$data" ] || continue
    png="${data%.*}.png"

    gnuplot <<END-OF-PLOT

        set term png enhanced size 1024,512
        set output "$png"

        set title "$data"
        plot "$data" u 1:2 notitle w lines

END-OF-PLOT
done

このexport LANG=C LC_ALL=C行はデフォルトのC / POSIXロケールを設定します。他の人(例:インストラクター/教師/ TA)が同じスクリプトを実行しているが、偶然に異なる言語を使用している場合(そしてあなたと他のロケールを好む)、まだ同じプロットを再生成します。

(問題はあるロケールは.小数点として使用し、あるロケールは,.

globパターンと一致するファイルがない場合、デフォルトX_*.outではBashはループ本体を1回繰り返し、dataX_*.out自体を持ちます。この[ -r "$data" ] || continueテストは、指定された読み取り可能ファイルが変数に存在することを確認しますdata。それ以外の場合は、次の繰り返しにジャンプします(残りのループ本体はこの値に対して実行されません)。

png割り当てに注意してください。${data%.*}結果は変数値data(ここではデータファイル名)ですが、最後からすべてが.削除されます。 (.中になければdata何も削除されません。)

したがって、Bashでは${data%.*}.png結果はの値ですが、dataファイル名のサフィックスがある場合に置き換えられます.png。ファイル名のサフィックスがない場合は.png追加されます。

<<END-MARKER起動に使用ここのドキュメントバッシュから。次に始まる行の内容まで(ただし、含まない)がEND-MARKER入力として提供されます。ただし、この資料では変数の拡張が行われているため、この資料または構文$variable(およびその他の構文)を使用してその${variable}内容に置き換えられます。

Bashコマンドラインコマンドとは異なり、ここでBashドキュメントの引用符は保持されます。したがって、png値がある場合はX_001.out拡張されset output "$png"、Gnuplotはそれを処理しますset output "X_001.out"

答え2

たとえば、入力ファイルと出力exe-templateファイルの名前にはテンプレートスクリプトにプレースホルダを使用します。X_inputX_input.png

set term png size 1600,1200
set output "X_input.png"
splot 'X_input'

次に、ループ内のデータファイルの名前をsed変更しX_input、結果修正スクリプトを一時ファイルに書き込みます。例exe-tmp:

for i in X_[0-9][0-9][0-9] ; do
  sed -e 's/X_input/'${i}'/g' exe-template >exe-tmp
  chmod 755 ./exe-tmp
  ./exe-tmp
done

関連情報