以下代码执行完美:
do for [i=1:$M_Orbs]{
set table 'L_z_'.i.'.dat'
plot [0:250] "L_z_expectation.dat" u 1:2+2*((i-1)*$M_Orbs+i) smooth cspline w l
unset table
set table 'Nocc_'.i.'.dat'
plot [0:250] "NO_PR.out" u 1:2+$M_Orbs-i smooth cspline t 'M='.i w l
unset table
}
但是当我尝试使用粘贴命令在循环中组合这些文件时,我遇到了麻烦:
plot for [i=1:$M_Orbs] '< paste 'L_z_'.i.'.dat' 'Nocc_'.i.'.dat'' u 1:(\$2*\$5)
此行显示错误,
plot for [i=1:2] '< paste 'L_z_'.i.'.dat' 'Nocc_'.i.'.dat'' u 1:($2*$5)
^
line 0: x range is invalid
我很确定发生错误是因为gnuplot在for循环中将i赋值给它之前尝试执行paste命令。有没有另一种逃避我的方式,或者至少以另一种方式诋毁同一个想法?
答案 0 :(得分:0)
你的报价错误。
在单引号'
中,您可以使用双引号"
而不转义它们,或双引号''
(这是单引号转义的方式)。
但是不能引用给paste
的文件名,因此您的绘图命令变为:
plot for [i=1:$M_Orbs] '< paste L_z_'.i.'.dat Nocc_'.i.'.dat' u 1:(column(2)*column(5))
column(2)
是$2
的长版本,但不得转义。
您还可以使用sprintf
格式化文件名:
plot for [i=1:$M_Orbs] '< paste '.sprintf('L_z_%d.dat Nocc_%d.dat', i, i) u 1:(\$2*\$5)
我更喜欢后一种变体,因为它允许你,例如用零填充数字:sprintf('L_z_%03d.dat', )
。