1

我目前正在运行一个接受输入文件的程序。输入文件有各种参数,其中3个我需要更改,再次运行等。这3个参数的范围是一个15个值,另一个12个值,另一个10个值,所以我有15 * 12 * 10( =1800) 我需要为程序制作的可能输入文件。输出文件名也需要与该运行的参数匹配。显然,手动创建 3375 个输入文件是不切实际的,不仅因为它会耗费时间,而且人为错误的风险也会很大。我需要以下帮助:

  1. 改变我的输入文件的参数。我知道这可以使用 AWK 或使用 shell 脚本来完成。输入文件是纯文本(ascii)

  2. 每次更改参数时递归运行脚本。假设我的输入文件如下所示:

    输入文件模型

    A 的值

    1

    B 的价值

    2

    C 的值

    4

    D 的价值

    12

假设我要更改的三个参数是 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

请让我知道这是否是正确的想法?我不知道如何存储变量,因此循环的每次迭代都会创建一个新的输入文件或输入参数。

或者可能是这样的?

A=1
While A<11
    B = 2
    While B<11
        D=12
        While D<13
        D++
    B+3
A+5
4

2 回答 2

1

老实说,每次我试图阅读您的描述时,我都会陷入困境,因为我迷失在术语和解释中,我对您要求递归解决方案但随后显示非递归算法感到困惑,但如果你说你只想生成一堆文件,每个文件包含 3 个字段,每个字段的值范围为:

  • 字段 1 = 1 到 11 由 5 秒
  • 字段 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)
         }
      }
   }
}'

如果这不能满足您的要求,请告诉我们它以何种方式失败。

于 2012-12-09T17:03:11.617 回答
0

我完全不清楚为什么要为每组参数创建一个输入值,而不是简单地根据需要生成数据。也许您只是在寻找类似的东西:

#!/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 重定向到文件并处理该文件,而不是使用管道。

于 2012-12-09T18:54:19.290 回答