使用AWK或Shell脚本更改输入文件参数并递归运行程序?

使用AWK或Shell脚本更改输入文件参数并递归运行程序?,shell,recursion,awk,Shell,Recursion,Awk,我目前正在运行一个接受输入文件的程序。输入文件有各种参数,其中3个我需要更改,再次运行,等等。 这3个参数的范围是一个15个值,另一个12个值,另一个10个值,所以我有15*12*10=1800个可能的输入文件,我需要为程序制作。输出文件名也需要与该运行的参数匹配。显然,手工创建3375个输入文件是不切实际的,不仅因为这会很耗时,而且人为错误的风险也很大。我需要以下方面的帮助: 更改输入文件的参数。我知道这可以通过AWK完成,或者使用shell脚本。输入文件是纯文本ascii 每次更改参数时递归

我目前正在运行一个接受输入文件的程序。输入文件有各种参数,其中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更改三个变量,以便获得每个组合,并将相应的输入文件传递给程序

以下是我认为它在伪代码中的样子我知道这是错误的需要一些帮助:

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个?如果可以生成输入,为什么还要创建输入文件呢?只要根据需要生成数据。嗨,算法不应该是递归的,但它生成的文件应该是递归的,因为它们涵盖了所有可能的参数组合。明天早上我会试试你的剧本。我从这个项目中休息了几周,仔细考虑了一下。谢谢你的回复!