从文件中收集并存储匹配的整数

从文件中收集并存储匹配的整数

我有一个结果文件,其中包含:

==============================================
------------------------------
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

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

现在我只想将结果文件中的整数x1x2、 和提取到一个单独的文件中,例如。要使用和提取行,我有: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

如果您的结果文件名为“输入”

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

相关内容