1

私は現在、入力ファイルを受け入れるプログラムを実行しています。入力ファイルにはさまざまなパラメータがあり、そのうち3つを変更したり、再実行したりする必要があります。これら3つのパラメータの範囲は、1つの値が15、別の値が12、別の値が10なので、15 * 12 * 10( = 1800)プログラム用に作成する必要のある入力ファイル。出力ファイル名は、その実行のパラメーターとも一致する必要があります。明らかに、3375個の入力ファイルを手動で作成することは、時間がかかるだけでなく、人的エラーのリスクが大きいため、実用的ではありません。次のことについてサポートが必要です。

  1. 入力ファイルのパラメータを変更します。これはAWKを使用するか、シェルスクリプトを使用して実行できることを私は知っています。入力ファイルはプレーンテキスト(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つ離れています。それらのうちの2つです{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}の値に対応します。

したがって、私の2つの問題は基本的に次のとおりです。1変更した入力ファイルを使用してプログラムを再帰的に実行するラッパーを作成します。23つの変数を変更して、すべての組み合わせを取得し、対応する入力ファイルをプログラムに渡します。

これが擬似コードでどのように見えるべきかを私が思うものです(私はこれが間違っていることを知っていますいくつかの助けが必要です):

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 = 5 秒ごとに 1 ~ 11
  • フィールド 2 = 3 秒ごとに 2 ~ 11
  • フィールド 3 = 1 秒ごとに 12 ~ 13

そして、各組み合わせを「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

入力ファイルを保持したい場合は、パイプを使用するのではなく、猫をファイルにリダイレクトしてそのファイルを処理します。

于 2012-12-09T18:54:19.290 に答える