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_*.png
X_*.out
X_*.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는 루프 본문을 한 번 반복하고 data
값 X_*.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_input
X_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