使用AWK或Shell脚本更改输入文件参数并递归运行程序?
我目前正在运行一个接受输入文件的程序。输入文件有各种参数,其中3个我需要更改,再次运行,等等。 这3个参数的范围是一个15个值,另一个12个值,另一个10个值,所以我有15*12*10=1800个可能的输入文件,我需要为程序制作。输出文件名也需要与该运行的参数匹配。显然,手工创建3375个输入文件是不切实际的,不仅因为这会很耗时,而且人为错误的风险也很大。我需要以下方面的帮助: 更改输入文件的参数。我知道这可以通过AWK完成,或者使用shell脚本。输入文件是纯文本ascii 每次更改参数时递归运行脚本。假设我的输入文件如下所示: 输入文件模型 价值 一, B的值 二, C的值 四, D的值 十二, 假设我要更改的三个参数是A、B和D。假设A的每个值间隔5个单位,我要运行3个值。我可能的A值是{1,6,11} B的可能值间隔3个单位,有4个值{2,5,8,11} D的值间隔为1,有两个{12,13} 考虑到重复值,我希望处理的集合为: {1,2,12} {1,5,12} {1,8,12} {1,11,12} {1,2,13} {1,5,13} {1,8,13} {1,11,13} {6,2,12} {6,5,12} {6,8,12} {6,11,12} {6,2,13} {6,5,13} {6,8,13} {6,11,13} {11,2,12} {11,5,12} {11,8,12} {11,11,12} {11,2,13} {11,5,13} {11,8,13} {11,11,13} 其中括号中的每个位置对应于{A,B,D}的值 所以我的两个问题基本上是: 1制作一个包装器,使用更改的输入文件递归运行程序 2更改三个变量,以便获得每个组合,并将相应的输入文件传递给程序 以下是我认为它在伪代码中的样子我知道这是错误的需要一些帮助:使用AWK或Shell脚本更改输入文件参数并递归运行程序?,shell,recursion,awk,Shell,Recursion,Awk,我目前正在运行一个接受输入文件的程序。输入文件有各种参数,其中3个我需要更改,再次运行,等等。 这3个参数的范围是一个15个值,另一个12个值,另一个10个值,所以我有15*12*10=1800个可能的输入文件,我需要为程序制作。输出文件名也需要与该运行的参数匹配。显然,手工创建3375个输入文件是不切实际的,不仅因为这会很耗时,而且人为错误的风险也很大。我需要以下方面的帮助: 更改输入文件的参数。我知道这可以通过AWK完成,或者使用shell脚本。输入文件是纯文本ascii 每次更改参数时递归
A = 1
B = 2
D = 12
for B<11,
for A<11,
for D<13,
B+3, A+5, D++, program input file
#input file mockup
#Value for A
Some Expression for {A}
#Value for B
Some Expression for {B}
#Value for C
4
#Value for D
Some Expression for {D}
outputdirectory: mkdir Run.ABD
或者像这样的
注意:我已经在另一个网站上发布了这个问题,看看是否有其他人可以在那里回答。我不是拖拉或众包;寻找真正的帮助。
另外,如果有人感兴趣,我正在运行一个同震位移模型,我需要改变每次运行的深度、长度和位移。我假设在整个介质中有线性滑动和均匀的粘度。该程序很好,准备好了,我只需要找出一种方法,用可变参数修改我的输入文件
编辑:
我意识到我的逻辑循环应该是这样的:
A=1
B=2
D=12
While A<11
While B<11
While D<13
D++
B+3
A+5
#!/bin/bash
c=5
for (( a=1; a <= 11; a += 5 )); do
for (( b=2; b <= 11; b += 1 )); do
for (( d=12; d <= 13; d += 1 )); do
cat << EOF | # Pipe the data into the awk below
input file mockup
Value for A
$a
Value for B
$b
Value for C
$c
Value for D
$d
EOF
awk 1 > output-$a-$b-$c-$d # process with a trivial awk script
done
done
done
请让我知道这是否是正确的想法?我不知道如何存储变量,这样循环的每次迭代都会创建一个新的输入文件或输入参数
或者像这样
A=1
While A<11
B = 2
While B<11
D=12
While D<13
D++
B+3
A+5
老实说,每次我试着阅读你的描述时,我都会被划出来,因为我在术语和解释中迷失了方向,我对你要求一个递归解决方案,然后展示非递归算法感到困惑,但是如果你想生成一组文件,每个文件包含3个字段,每个字段的值范围如下: 字段1=1到11乘以5s 字段2=2到11乘以3 字段3=12到13乘以1 然后将每个组合存储在一个单独的文件中,名为outfileN,其中N是从1开始的数字,那么就是:
awk 'BEGIN {
for (i=1;i<=11;i+=5) {
for (j=2;j<=11;j+=3) {
for (k=12;k<=13;k+=1) {
print i,j,k > (outfile ++n)
}
}
}
}'
如果这不符合您的要求,请告诉我们它以何种方式失败。我一点也不清楚为什么要为每一组参数创建一个输入值,而不是简单地根据需要生成数据。也许您只是在寻找以下内容:
A=1
B=2
D=12
While A<11
While B<11
While D<13
D++
B+3
A+5
#!/bin/bash
c=5
for (( a=1; a <= 11; a += 5 )); do
for (( b=2; b <= 11; b += 1 )); do
for (( d=12; d <= 13; d += 1 )); do
cat << EOF | # Pipe the data into the awk below
input file mockup
Value for A
$a
Value for B
$b
Value for C
$c
Value for D
$d
EOF
awk 1 > output-$a-$b-$c-$d # process with a trivial awk script
done
done
done
如果要保留输入文件,只需将cat重定向到一个文件并处理该文件,而不是使用管道。这个问题几乎无法理解。我有一个特别的问题:如果有1800个可能的输入文件,为什么要手工创建3375个?如果可以生成输入,为什么还要创建输入文件呢?只要根据需要生成数据。嗨,算法不应该是递归的,但它生成的文件应该是递归的,因为它们涵盖了所有可能的参数组合。明天早上我会试试你的剧本。我从这个项目中休息了几周,仔细考虑了一下。谢谢你的回复!