ファイルから一致する整数を収集して保存します。

ファイルから一致する整数を収集して保存します。

以下を含む結果ファイルがあります。

==============================================
------------------------------
Begin SimulationInterface Evaluation    1
------------------------------
Parameters for evaluation 1:
                     -1.8961789208e+00 x1
                     -1.3853582017e+00 x2

Direct interface: invoking function 

Active response data for SimulationInterface evaluation 1:
Active set vector = { 1 }
                      2.4892772154e+03 response_fn_1

------------------------------
Begin SimulationInterface Evaluation    2
------------------------------
Parameters for evaluation 2:
                      3.7988695564e-01 x1
                      1.5859091288e+00 x2

Direct interface: invoking function 

Active response data for SimulationInterface evaluation 2:
Active set vector = { 1 }
                      2.0820416317e+02 response_fn_1

==================================

今、結果ファイルから整数、、、およびをx1別々x2のファイルに抽出したいと思います。行を使用して抽出するには、次のようにします。response_fn_1testx1x2

sed -n '/評価パラメータ/{n;p;n;p}'initial.log

合計が表形式にtestなるように、行の整数を出力ファイルにどのように転送できますか?x1x2

x1                     x2
-1.8961789208e+00      -1.3853582017e+00
3.7988695564e-01        1.5859091288e+00

答え1

すべてのタスクを実行するには、awkを使用することをお勧めします。

$ awk '
    BEGIN {OFS="\t"; print "x1", "x2", "response_fn_1"} 
    $2 == "x1" {x1 = $1} 
    $2 == "x2" {x2 = $1} 
    $2 == "response_fn_1" {print x1, x2, $1}
' file | column -t
x1                 x2                 response_fn_1
-1.8961789208e+00  -1.3853582017e+00  2.4892772154e+03
3.7988695564e-01   1.5859091288e+00   2.0820416317e+02

パイプスルーはcolumn -tきれいな印刷にのみ使用されます。 awk 出力自体はタブで区切られます。

答え2

結果ファイル名が「input」の場合

for i in x1 x2 response_fn_1 ; do echo $i > $i; grep $i input | awk '{print $1}' >> $i ; done ; paste x1 x2 response_fn_1 | column -t

以下を提供します。

x1                 x2                 response_fn_1
-1.8961789208e+00  -1.3853582017e+00  2.4892772154e+03
3.7988695564e-01   1.5859091288e+00   2.0820416317e+02

ノート!これにより、作業中のディレクトリに x1 x2 および response_fn_1 というファイルが破壊的に生成されます。実際のファイルの場合は上書きされます。

答え3

Perlをslurpモードで使用して、これを実行し、Beginで始まる行の周りの配列にファイルを分割できます(要件に合わせて変更できます)。次に、各配列要素に最初の項目(Perlでは0番目)を格納し、2つのフィールドのみを持つ行を検出し、2番目のフィールド=>値をハッシュ%hの最初のフィールドとして保存します。正規表現で得られた一致を反転してこれを取得します。次に印刷します。

$ perl -F'/^Begin.+$/m' -ln -0777 -ae'
    ($,, @A) = ($", qw/x1 x2 response_fn_1/);
    for(@F) {
        my %h = reverse /^\s*(\S+)\s+(\S+)$/mg;
        print(@A),next if ! $a++;
        print @h{@A};
    }
  ' initial.log | column -t

関連情報