2011-12-28 33 views
3

我有两个文件,这都遵循相同的模式:如何使用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

+0

请问'粘贴<(猫文件1) <(cat file2)| awk ....'让问题更容易? – potong 2011-12-28 12:35:55

+0

@potong:是的。事实上,这正是我在解决方案中所做的。 =) – gablin 2011-12-28 12:48:50

回答

1

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

paste <(grep "^TEST CASE" file1) <(grep "^TEST CASE" file2) | 
awk '{print "TEST CASE " $3 " " $4/$9}' 

grep是那里得到预期的输入paste作为线路是从里面包含了很多的,我不希望其他信息的文件拍摄。如果预期的输出是一个单独的文件已经存在(因为我在这个问题说明),则该命令变为

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 
.... 
3

如果它们具有相同的测试用例,则可以简单地将这两个文件按照排序的方式组合,然后使用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%) 

下面是它如何工作的。子shell (...)改变这两个文件,这样他们就会正确地排序用一个简单的命令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然后有一个两状态的迷你状态机。在零状态下,它只存储前一时间并将状态设置为一。在状态一中,它在将状态设置回零之前计算并打印所需的值。


如果你想包括测试用例数量和自然排序,你可以(添加测试用例10到输入文件之后)使用方法:

pax:~$ (cat file1 |sed 's/:/: A /' ; cat file2 |sed 's/:/: B /') |sort |awk '{ 
    if (s == 0) { 
     s = 1; 
     before = $5; 
    } else { 
     s = 0; 
     printf "%5s %s->%s (%d%%)\n", $3, before, $5, int(100 * $5/before - 100) 
    } 
}' |sort -n 

    1: 0.004->0.003 (-25%) 
    2: 0.043->0.040 (-6%) 
    3: 0.234->0.134 (-42%) 
    4: 0.564->0.664 (17%) 
    10: 0.564->0.764 (35%) 
+0

嗯,看起来很整齐。出于好奇,是否可以合并这两个结果文件,以便两个结果值最终在同一行上?如果是这样,那么'awk'脚本将变得微不足道。 – gablin 2011-12-28 10:09:31

+0

如果有超过10个测试用例,排序将作为测试用例nr。 10将出现在测试用例nr之前。 1. – gablin 2011-12-28 11:28:02

+0

这是一个有效的观点,@gablin,我做了一个补充,展示了如何处理这个问题。 – paxdiablo 2011-12-28 12:20:49

0

这不是你问什么了,但用awk,直到有人提供了一个解决方案,你坚持我,我只知道Perl的:)

​​

你只要给该文件作为参数。