如何使用awk处理两个结果文件?

如何使用awk处理两个结果文件?,awk,Awk,我有两个文件,它们都遵循相同的模式: TEST CASE 1: 0.004 seconds TEST CASE 2: 0.043 seconds TEST CASE 3: 0.234 seconds TEST CASE 4: 0.564 seconds .... 我要做的是计算每个测试用例的加速比,这是通过 值,并将其与另一个文件中的相应值相除 使用awk有一种简单的方法吗?如果它们有相同的测试用例,您可以简单地以排序的方式组合这两个文件,然后使用awk处理结果流,存储每对的第一次,然

我有两个文件,它们都遵循相同的模式:

TEST CASE 1:  0.004 seconds
TEST CASE 2:  0.043 seconds
TEST CASE 3:  0.234 seconds
TEST CASE 4:  0.564 seconds
....
我要做的是计算每个测试用例的加速比,这是通过 值,并将其与另一个文件中的相应值相除


使用
awk
有一种简单的方法吗?

如果它们有相同的测试用例,您可以简单地以排序的方式组合这两个文件,然后使用
awk
处理结果流,存储每对的第一次,然后在第二次计算

类似于以下文字记录:

pax:~$ cat file1
TEST CASE 1:  0.004 seconds
TEST CASE 2:  0.043 seconds
TEST CASE 3:  0.234 seconds
TEST CASE 4:  0.564 seconds

pax:~$ cat file2
TEST CASE 1:  0.003 seconds
TEST CASE 2:  0.040 seconds
TEST CASE 3:  0.134 seconds
TEST CASE 4:  0.664 seconds

pax:~$ ( cat file1 |sed 's/:/: A /' ; cat file2 |sed 's/:/: B /' ) |sort |awk '{
    if (state == 0) {
        before = $5;
        state = 1;
    } else {
        print before" -> "$5" ("("int(100 * $5 / before - 100)"%)")"
        state = 0;
    }
}'
0.004 -> 0.003 (-25%)
0.043 -> 0.040 (-6%)
0.234 -> 0.134 (-42%)
0.564 -> 0.664 (17%)
下面是它的工作原理。subshell
(…)
将更改这两个文件,以便使用简单的
sort
命令将它们正确排序为以下内容:

TEST CASE 1: A   0.004 seconds
TEST CASE 1: B   0.003 seconds
TEST CASE 2: A   0.043 seconds
TEST CASE 2: B   0.040 seconds
TEST CASE 3: A   0.234 seconds
TEST CASE 3: B   0.134 seconds
TEST CASE 4: A   0.564 seconds
TEST CASE 4: B   0.664 seconds
换言之,分为前后值对。
awk
则有一个具有两种状态的微型状态机。在状态0中,它只存储before时间并将状态设置为1。在状态1中,它计算并打印所需的值,然后再将状态设置回零


如果希望包含测试用例编号并进行自然排序,可以使用(将测试用例10添加到输入文件后):


这并不完全是您所要求的,但在有人提供使用awk的解决方案之前,您必须了解我,我只知道perl:)

#/usr/bin/perl
严格使用;
使用警告;
我的$zaehler=0;
而(){
/:\s*([\d.]*)s/;
打印(($zaehler/$1)。“\n”);
$zaehler=$1;
}

您只需将该文件作为一个参数。

我通过使用
paste
合并两个结果文件,找到了自己的解决方案。然后
awk
脚本变得非常简单,测试用例被正确地排序

paste <(grep "^TEST CASE" file1) <(grep "^TEST CASE" file2) |
awk '{print "TEST CASE " $3 "  " $4 / $9}'
这将作为输出提供:

TEST CASE 1:  1.0423
TEST CASE 2:  2.34023
TEST CASE 3:  3.2423
TEST CASE 4:  4.3425
....

嗯,看起来有点整洁。出于好奇,是否有可能合并两个结果文件,使两个结果值最终位于同一行?如果是这样,那么
awk
脚本将变得微不足道。如果有10个以上的测试用例,排序将被关闭,因为第10个测试用例将出现在第1个测试用例之前。这是一个有效点,@gablin,我添加了一个说明如何处理此问题的内容。will
paste@poton:是的。事实上,这正是我在解决方案中所做的
paste <(grep "^TEST CASE" file1) <(grep "^TEST CASE" file2) |
awk '{print "TEST CASE " $3 "  " $4 / $9}'
paste file1 file2 | awk '{print "TEST CASE " $3 "  " $4 / $9}'
TEST CASE 1:  1.0423
TEST CASE 2:  2.34023
TEST CASE 3:  3.2423
TEST CASE 4:  4.3425
....