我有一个结果文件,其中包含:
==============================================
------------------------------
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
如果您的结果文件名为“输入”
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
我们可以在 slurp 模式下使用 Perl 来完成此操作,并将文件分割成以 Begin 开头的行周围的数组(您可以对其进行修饰以满足您的要求)。然后,从每个数组元素中,保存第一个(Perl 中的第 0 个),我们检测仅具有两个字段的行,并将它们保存在以第二个字段 => 值作为第一个字段的哈希 %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