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

时间:2012-12-09 05:40:25

标签: shell recursion awk

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

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

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

    输入文件模型

    A

    的值

    1

    B

    的值

    2

    C

    的值

    4

    D

    的值

    12

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

2 个答案:

答案 0 :(得分:0)

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

  • 字段1 = 1到11乘5s
  • 字段2 = 2到11乘3s
  • 字段3 = 12到13乘1秒

并将每个组合存储在一个名为的单独文件中,例如&#34; outfileN&#34;如果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)
         }
      }
   }
}'

如果那不能做你想做的事,请告诉我们它失败的方式。

答案 1 :(得分: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重定向到文件并处理该文件而不是使用管道。