私はUnixとシェルスクリプトを書くための完全な初心者です。したがって、私の質問に対する解決策がやや普通の場合は謝罪します。
しかし、本質的に私のシェルスクリプト "run.x"は毎回異なる初期条件を読み取る必要がありますが、同じ初期条件を繰り返し読んでいます。問題のコードはここにあります。問題はsedにあるようです。
実行.x:
./sursec.x < ./sursecout.txt
sed -n '1,2p;3q' sursecout.txt
cd ..
mv ./data ./CJ=3.029990
mkdir data
cd SurSec
./sursec.x < ./sursecout.txt
sed -n '3,4p;5q' sursecout.txt
cd ..
mv ./data ./CJ=3.030659
mkdir data
cd SurSec
したがって、上記の各コードブロックの最初の2行は、次の2行で読み取る必要があります。
Sursecout.txt:
3.029990d0
0.81476d0
3.030659d0
0.81476d0
上記のコードの最初の部分はそれぞれ3.029990d0、0.81476d0、次の部分はそれぞれ3.030659d0、0.81476d0でなければなりません。これは sursecout.txt から取得された初期条件であり、sursec.x という別のスクリプトで実行されます。その後、各プロセスは "CJ = ..."フォルダを作成し、ここに10個の出力テキストファイルを保存します。私のシェルスクリプトは合計30のプロセスを実行します。私の問題は、それぞれ正しいCJ値を持つ30個のフォルダがありますが、各フォルダにはまったく同じ10個の出力ファイルセットがあることです。私のシェルスクリプトは同じプロセスを30回繰り返すようですが、別のフォルダに保存します。
答え1
私が理解しているように、データファイルの各行のペアを読み、次のsursec.x
2data
行の最初の値に近い名前で結果ディレクトリを保存しようとしています。
while IFS= read -r line1 && IFS= read -r line2 # Read two lines from the datafile
do
mkdir -p ../data # Create data directory (if necessary)
printf "%s\n%s\n" "$line1" "$line2" | ./sursec.x # Feed the two lines to sursec
target="CJ=${line1%d0}" # Prefix "CJ=" and strip trailing "d0"
mv ../data ../"$target" # Rename "data" as "$target"
done < sursecout.txt
独自のコードが機能しない理由は、ソースデータファイルを変更しないためです。したがって、プログラムはsursec.x
常に同じ最初の2行を提供します。
プログラムが親ディレクトリにデータファイルを生成する必要がある理由は少し混乱していますsursec.x
。しかし、これはあなたのサンプルコードが何をしているのか、私のコードはここでも同じだと仮定します。