好的,这就是交易。我正在开始我的计算材料科学本科论文,我正在尝试将一些脚本放在一起以帮助准备数据分析。
我一直在准备一个 GAWK 脚本,它基本上会获取一些数据(排列在 4 列中)并抓取其中的两个并在 GNUPLOT 中绘制它们。为此,我读入了包含多个时间步长及其关联数据的数据文件,将文件拆分为每个时间步长的单独 .dat 文件。
从那里我只是为 GNUPLOT 生成一个基本的输入脚本,并绘制每个时间步,因为它们出现在数据文件中。
问题是由于某种原因,所有生成的图都是完全相同的图(在这种情况下总是第一个时间步),但它们被保存为正确的时间步。
我已经浏览并跟踪了整个脚本中的每个变量/文件名,最后确定问题出在某种程度上是从脚本调用 GNUPLOT。我拿出我的系统命令并编写了一个简短的 bash 脚本,它从 for 循环中调用 gnuplot:
#!/bin/bash
for file in ./*gnu
do
gnuplot $file
done
这仍然会导致所有情节都相同的相同问题。然后,我只是从包含 .gnu 文件的目录中的命令行中运行命令 gnuplot *gnu 并且它起作用了。
我想我只是想知道是否有一些我需要刷新的缓冲区,或者我只是错过了什么?
GAWK 脚本如下所示。我还是新手,所以如果你想用一些建设性的批评来评论剧本,我也将不胜感激。
#!/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);
}
我正在读取的数据文件片段是:
# 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 组数据,但我想我会在这里缩短,这样你就会明白了。