以下を含む結果ファイルがあります。
==============================================
------------------------------
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_1
test
x1
x2
sed -n '/評価パラメータ/{n;p;n;p}'initial.log
合計が表形式にtest
なるように、行の整数を出力ファイルにどのように転送できますか?x1
x2
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