2011-12-28 72 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的:)

​​

你只要給該文件作爲參數。