2012-09-24 2 views
2

만 잘 나타내므로 확인해보십시오. 나는 전산 재료 과학에서 학부 논문을 시작하고 데이터 분석을 준비하는 데 도움이되는 몇 가지 스크립트를 작성하려고합니다.GAWK 및 Bash 스크립트에서 Gnuplot을 호출하면 첫 번째 플롯 인 플롯

나는 기본적으로 (4 열로 정렬 된) 일부 데이터를 취하여 그 중 두 개를 잡아 GNUPLOT으로 그려 줄 GAWK 스크립트를 준비하고있다. 이를 위해 여러 timestep과 관련 데이터가있는 데이터 파일을 읽은 다음 파일을 각 timestep의 개별 .dat 파일로 분할합니다.

거기에서 GNUPLOT에 대한 기본 입력 스크립트를 생성하고 데이터 파일에서 발생하는 각 timestep을 플로트합니다.

문제는 어떤 이유로 생성 된 모든 플롯이 정확히 동일한 플롯 (이 경우 항상 항상 첫 번째 단계)이지만 올바른 타임 스텝으로 저장된다는 것입니다.

나는 스크립트를 통해 이미 각 변수/파일 이름을 추적하고 마지막으로 스크립트에서 GNUPLOT을 호출하여 문제가 발생했음을 확인했습니다. 내 시스템 명령을 꺼내서 for 루프에서의 gnuplot를 호출하는 간단한 bash는 스크립트 작성 :

#!/bin/bash 
for file in ./*gnu 
do 
    gnuplot $file 
done 

을 그리고 여전히 플롯 모두가 같은 같은 문제가 발생합니다. 그런 다음 .gnu 파일이 들어있는 디렉토리의 명령 줄에서 gnuplot * gnu 명령을 실행하면 제대로 작동합니다.

내가 플러시 할 필요가있는 버퍼가 있는지, 아니면 그냥 놓친 것일까 요?

GAWK 스크립트는 다음과 같습니다. 나는 아직도 이것을 처음 접했고, 그래서 당신이 약간의 건설적인 비판으로 대본에 대해 논평하고자한다면, 나는 또한 그것을 크게 높이 평가할 것이다.

# Time-averaged data for fix rdf 
# TimeStep Number-of-rows 
# Row c_allrdf[1] c_allrdf[2] c_allrdf[3] 
500 100 
1 0.005 0 0 
2 0.015 0 0 
3 0.025 0 0 
4 0.035 0 0 
5 0.045 0 0 
6 0.055 1.16597 0.00133333 
7 0.065 2.08865 0.00466667 
8 0.075 1.56958 0.008 
9 0.085 0.733433 0.01 
10 0.095 0.587288 0.012 
600 100 
1 0.005 0 0 
2 0.015 0 0 
3 0.025 2.79219 0.000666667 
4 0.035 2.86766 0.002 
5 0.045 0 0.002 
6 0.055 0.582985 0.00266667 
7 0.065 2.08865 0.006 
8 0.075 0.62783 0.00733333 
9 0.085 0.488955 0.00866667 
10 0.095 1.17458 0.0126667 

일반적으로 각 시간 단계 섹션에서 데이터의 100 개 세트있다,하지만 난 당신 때문에 여기 단축 거라고 생각 :

#!/opt/local/bin/gawk -v inputf=$1 -f             

# Write gnuplot files and plot RDF data             
function plot_rdf(timestep, Load_RDF_dat) 
{ 
# Set number of digits in filenames to 6 so data is organized       
    if (timestep < 10){ 
     pad_timestep="00000"timestep; 
    } 
    else if (timestep < 100){ 
     pad_timestep="0000"timestep; 
    } 
    else if (timestep < 1000){ 
     pad_timestep="000"timestep; 
    } 
    else if (timestep < 10000){ 
     pad_timestep="00"timestep; 
    } 
    else if (timestep < 100000){ 
     pad_timestep="0"timestep; 
    } 
    else{ 
     pad_timestep=timestep; 
    } 

# Give output filenames                 
     gnu_file="plot_RDF_"pad_timestep".gnu"; 
     png_file="RDF_"pad_timestep".png"; 

# Create input files for gnuplot               
     print "set output \""png_file"\"" >> gnu_file; 
     print "set terminal png" >> gnu_file; 
     print "plot './"Load_RDF_dat"' u 1:2" >> gnu_file; 
     close(gnu_file); 
     system("gnuplot "gnu_file); 
} 


# Main part of script                 
{ 
# Parse the RDF data and save it to GNUPLOT readable files        
    while(getline < inputf){ 
     if ($1 == "#"){ 
      # skips the three commented header lines          
      next; 
     } 
     else if (NF == 2){ 
      timestep=$1; 
      bin_num=$2; 
      print "Reading timestep "timestep; 
      RDF_dat="RDF_"timestep".dat"; 
      next; 
     } 
     else if (NF == 4){ 
      print $2" "$3 >> RDF_dat; 
      if ($1 == bin_num){ 
       plot_rdf(timestep, RDF_dat); 
       close(RDF_dat); 
      } 
      next; 
     } 
    } 
    close(inputf); 
    close(RDF_dat); 
} 

내가에서 읽고 있어요 데이터 파일의 조각이다 아이디어를 얻었 어.

+0

"마지막으로 문제가 GNUPLOT을 스크립트에서 호출하는 것으로 결정되었습니다."- 결론이 얼마나 이상하다고 생각하니? 문제는 스크립트에서 * gnuplot *을 호출하지 않는 것입니다. –

답변

0

mgilson 메모에서 $1 == bin_num이 없기 때문에 plot_rdf를 호출하지 못했을 수 있습니다. 명령 행에서 데이터 파일 이름을 사용하여 awk를 호출하면 awk의 내장 파일 읽기 루프를 쉽게 사용할 수 있습니다. 이것은 awk 프로그램의 다음 다시 쓰기에서 설명됩니다. 또한주의 :
if 문 다음의 경우

의 서투른 시리즈 대신 pad_timestep = sprintf("%06d", timestep);를 사용하여 • 대신
후 의,의 gnuplot을 실행하기 전에 RDF_dat을 폐쇄 • 두 곳
>를 사용하는 대신 >> • 나는 프로그램을 넣어 파일 so-gnuplot-awk로, 데이터 파일 data-so-gnuplot에로는-이며,

awk -f so-gnuplot-awk data-so-gnuplot 

프로그램을 통해 프로그램을 호출 :

# Parse the RDF data and save it to GNUPLOT readable files 
BEGIN { dopen=0 } 

NF==2 { 
    if (dopen) plot_rdf(timestep, RDF_dat); 
    timestep = $1; 
    print "Reading timestep "timestep; 
    RDF_dat="RDF_"timestep".dat"; 
    printf "" > RDF_dat  # Init empty file 
    dopen = 1; 
} 

NF == 4 { if (dopen) print $2" "$3 >> RDF_dat; } 

# Write gnuplot files and plot RDF data 
function plot_rdf(timestep, Load_RDF_dat) { 
# Set output filenames & create gnuplot command file 
    pad_timestep = sprintf("%06d", timestep); 
    gnu_file="plot_RDF_"pad_timestep".gnu"; 
    png_file="RDF_"pad_timestep".png"; 
    print "set output \""png_file"\"" > gnu_file; # Use > first 
    print "set terminal png" >> gnu_file; 
    print "plot './"Load_RDF_dat"' u 1:2" >> gnu_file; 
    close(gnu_file); 
    close(RDF_dat); 
    print "Plotting with "RDF_dat" into "png_file 
    system("gnuplot "gnu_file); 
    dopen=0 
} 

END { if (dopen) plot_rdf(timestep, RDF_dat); } 
+0

아, 감사합니다. 다른 사람이 gawk 스크립트를 작성하는 것을 보았을 때 나는 언어를 더 잘 이해할 수있었습니다. 모든 도움에 감사드립니다! – Steve

0

나는 당신의 질문에 대답 할 수 있을지 확신하지 못한다. 그러나 나는 당신의 데이터 파일을 약간 수정했을 때, 나를 위해 잘 작동한다고 생각한다. bin_num 이후

if ($1 == bin_num){ 
     plot_rdf(timestep, RDF_dat); 
     close(RDF_dat); 
    } 

가 촬영 :

# Time-averaged data for fix rdf 
# TimeStep Number-of-rows 
# Row c_allrdf[1] c_allrdf[2] c_allrdf[3] 
500 100 
1 0.005 0 0 
2 0.015 0 0 
3 0.025 0 0 
4 0.035 0 0 
5 0.045 0 0 
6 0.055 1.16597 0.00133333 
7 0.065 2.08865 0.00466667 
8 0.075 1.56958 0.008 
9 0.085 0.733433 0.01 
10 0.095 0.587288 0.012 
100 0.095 0.56 0.014  #<-added this line 
600 100 
1 0.005 0 0 
2 0.015 0 0 
3 0.025 2.79219 0.000666667 
4 0.035 2.86766 0.002 
5 0.045 0 0.002 
6 0.055 0.582985 0.00266667 
7 0.065 2.08865 0.006 
8 0.075 0.62783 0.00733333 
9 0.085 0.488955 0.00866667 
10 0.095 1.17458 0.0126667 
100 0.095 1.179 0.12  #<-added this line 

그 선이의 gnuplot 때문에 라인의 기능을 플로팅 "트리거"에 필요했다 :

는 여기에 귀하의 데이터 파일의 내 수정 된 버전입니다 "머리글"의 두 번째 필드에서. (예 : 600 100).

전체 데이터 파일에 올바르게 설정했는지 여부는 확실하지 않습니다. 또한, 나는 같은 스크립트라는 : 완전히 처음에 오두막을 무시

gawk -f test.awk -v inputf=test.dat test.dat 

을,하지만 난 시스템의 많은 문제가 제대로들을 분열을 읽었습니다.

마지막으로 gnuplot의 버전은 무엇입니까? 4.6이면, 많은 고통을 피할 수 있습니다. gawk 스크립트를 완전히 건너 뛰고 훨씬 더 간단한 스크립트로 대체 할 수 있습니다.

+0

예, 미안합니다. 데이터에있는 빈 번호와 일치시켜야 다음 파일을 실행할 수 있습니다. 샘플 데이터를 올렸을 때 그것에 대해 생각하지 않았습니다. Gnuplot 4.6을 사용하고 있습니다.하지만 Gnuplot 내에서이 작업을 수행 할 수 있다는 것을 알지 못했습니다. – Steve