0

以下代码完美执行:

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 在将 i 分配给 for 循环中的值之前尝试执行粘贴命令。是否有另一种逃避 i 的方法,或者至少以另一种方式实现相同的想法?

4

1 回答 1

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', ).

于 2013-09-24T06:33:41.340 回答