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