저는 유닉스와 쉘 스크립트 작성에 있어서는 완전한 초보자입니다. 따라서 제 질문에 대한 해결책이 다소 평범하다면 사과드립니다.
그러나 본질적으로 내 쉘 스크립트 "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
따라서 위의 각 코드 블록의 처음 두 줄은 다음 두 줄에서 읽어야 합니다.
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
다음 data
두 행의 첫 번째 값에 가까운 이름으로 결과 디렉토리를 저장하려고 합니다.
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
항상 동일한 처음 두 줄을 제공합니다.
프로그램이 상위 디렉토리에 데이터 파일을 생성해야 하는 이유가 무엇인지 약간 혼란스럽습니다 sursec.x
. 그러나 이것이 귀하의 예제 코드가 수행하는 작업이기 때문에 제 코드는 여기서도 동일하다고 가정합니다.