我有一个Fortran代码,使用" namelist"来读取输入文件。特征。现在,有两个名称列表中的变量说x
和y
。所以最终我想要的是
do x=1,10
do y = 2,5
run fortran code with the new x and y.
end
end
现在,我的输入文件中有许多其他变量,由Fortran中的名称列表读取。所以,我正在寻找一些可以改变输入文件中特定x
和y
的shell脚本。
我的名单文件" input.inp"看起来像是:
&BASICS
x = 1
y = 2
H0_CONST = .F.
T0 = 293
Ma_in = 1.2
&END
我基本上想要运行我的程序go.exe来获取x和y的多个值。名单中定义的那些只是初始值加上一些应该保持不变的其他变量。 我的Fortran代码负责文件" input.inp"并将名单列为:
read(2,nml=basics, iostat=io_stat)
答案 0 :(得分:2)
您希望在配置文件中重复替换值,程序将在每次运行时读取输入。
您可以在嵌套for循环中使用sed
替换替换。
例如,对于给定的文件
$ cat file
&basics x=1 y=1 &end
与bash
约定保持一致,=
标志周围没有任何空白区域。
$ for x in {1..4}; do for y in {1..2};
do sed -i -r "s/x=\w+/x=$x/;s/y=\w+/y=$y/" file;
cat file; # <-- here run your program instead
done; done
&basics x=1 y=1 &end
&basics x=1 y=2 &end
&basics x=2 y=1 &end
&basics x=2 y=2 &end
&basics x=3 y=1 &end
&basics x=3 y=2 &end
&basics x=4 y=1 &end
&basics x=4 y=2 &end
而不是打印文件,您可以改为运行程序。
如果您的变量不是整数,则需要将sed
匹配从word更改为非空格。此外,对于循环,您必须这次枚举值。请查看下面的更新脚本......
$ for x in 1.1 2.2; do for y in 1.2 3.2;
do sed -i -r "s/x=\S+/x=$x/;s/y=\S+/y=$y/" file;
cat file;
done; done
答案 1 :(得分:2)
这是一个可以运行程序的简单脚本。将其保存为go
,然后只需键入以下内容即可运行包含所有NAMELIST文件的程序:
./go
bash
代码为:
#!/bin/bash
for x in {1..10}; do
for y in {2..5}; do
# Generate the NAMELIST file
{ echo "&BASICS"
echo " x=$x"
echo " y=$y"
echo " H0_CONST=.F."
echo " T0=293"
echo " Ma_in=1.2"
echo "&END"
} > input.inp
# Now run your program
YourProgram input.inp
done
done
在第一次运行它之前,您必须只使用一次,使脚本可执行:
chmod +x go