我有两个文件,这都遵循相同的模式:如何使用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
?
我设法通过使用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
....
如果它们具有相同的测试用例,则可以简单地将这两个文件按照排序的方式组合,然后使用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%)
这不是你问什么了,但用awk,直到有人提供了一个解决方案,你坚持我,我只知道Perl的:)
你只要给该文件作为参数。
请问'粘贴<(猫文件1) <(cat file2)| awk ....'让问题更容易? – potong 2011-12-28 12:35:55
@potong:是的。事实上,这正是我在解决方案中所做的。 =) – gablin 2011-12-28 12:48:50