2011-12-23 4 views
2

bash에서 gnuplot을 사용하여 데이터를 플롯하기위한 스크립트를 사용하고 있습니다. 그러나 그것은 효과가 없습니다.

데이터를 명령 행에 전달하는 프로그램이 있습니다. 파일에 해당 데이터를 수집 한 다음이 프로세스를 반복하여 원하는 결과를 얻습니다. 나는 기본적으로 내가 그것의 내용을 변경, 파일에서의 gnuplot 텍스트를 포맷하지만 파일의 이름을 변경하지 않고 던져, 그래서이 스크립트

N = 10 
./program.exe > data_$N.dat # Creating the data to be plotted 
for ((i = 0 ; i<1 ; i++)) do # Dummy loop to throw all together to gnuplot 
    echo "set size square" 
    echo "set xrange[-$N-1:$N+1]; set yrange[-$N-1:$N+1];" 
    echo "plot '-' using 1:2" 
    for((j = 0 ; j <= 9 ; j++)) do 
    # Throwing the data to gnuplot 
    echo "cat data_$N.dat" 
    # Updating the file and overwriting on it 
    echo "cat data_$N.dat | xargs ./program.exe > data_$N.dat" | bash 
    echo "e" 
    echo "pause 0.5" 
    done 
done | gnuplot -persist # Throwing the formatted data to gnuplot 

을 말해봐.

물론이 파일의 해당 단계에 해당하는 계산을 수행하고 파일을 업데이트 된 데이터로 덮어 쓰기 때문에 파일 이름을 변경하고 싶지 않습니다. 버퍼의 종류. 계산 흐름은

./program.exe > data.dat # Making the initial data 
begin gnuplot loop 
throw data to gnuplot 
"cat data.dat | xargs ./program.exe > data.dat" # update data overwriting file 
end gnuplot loop 
pipe all the script to gnuplot 

호프가 분명하고 도움이 될 수 있습니다 :). 감사!

PD. 나는 물리학 자야.

답변

5

>으로 리디렉션은 쉘에 의해 수행됩니다. 따라서 cat data_$N.dat | xargs ./program.exe > data_$N.dat을 실행할 때 가장 먼저 발생하는 것은 쉘이 쓰기를 위해 data_$N.dat을 열고 자르다는 것입니다. 이제 그것은 비어 있습니다. 따라서 cat이 시작될 때 파일을 찾았지만 이미 잘 렸습니다.

출력을 임시 위치로 리디렉션합니다 (PID를 반환하는 스크립트에서는 $$을 사용하는 것이 일반적이므로 스크립트가 다소 독립적입니다). 따라서 ... > tmp_$$.dat을 입력 한 다음 바로 그 다음에 mv -f tmp_$$.dat data_$N.dat을 입력하십시오.

+0

하지만 이상한데 ... 껍데기가 서면 명령을 따르지 않아? – stringparser

+3

쉘은이 명령을'PROGRAM | PROGRAM> FILE'을 선택하십시오. 셸의 역할은 파이프를 만들어 두 프로그램을 연결하고 최종 출력 파일을 여는 것입니다. 그런 다음'PROGRAM'을 실행하여 파이프/파일을 입력/출력으로 상속받습니다. 파이프 라인의 모든 요소는 동시에 실행됩니다. –