2013-02-13 64 views
3

我需要幫助與以下:awk |場相匹配的基礎上,融合線

輸入文件:

abc message=sent session:111,x,y,z 
pqr message=receive session:111,4,5,7 
abc message=sent session:123,x,y,z 
pqr message=receive session:123,4,5,7 
abc message=sent session:342,x,y,z 
abc message=sent session:589,x,y,z 
pqr message=receive session:589,4,5,7 

輸出文件:

abc message=sent session:111,x,y,z, pqr message=receive session:111,4,5,7 
abc message=sent session:123,x,y,z, pqr message=receive session:123,4,5,7 
abc message=sent session:342,x,y,z, NOMATCH 
abc message=sent session:589,x,y,z, pqr message=receive session:589,4,5,7 

注:

如果你在看源文件中,對於每個「已發送」消息,都有「接收」
僅適用於會話= 342沒有接收
會話不明,不能硬編碼
所以合併只有那些發送和接收,我們有匹配的會話數

+0

做的消息=接收總是遵循消息=立即發送,就像這個例子? – jkerian 2013-02-13 05:58:15

+0

並不總是..如果在同一個會話中有「message = sent」和「message = receive」,那麼只有組合 – 2013-02-13 06:00:06

+0

,如果你看到了,那麼在一個例子中我們有2個消息=發送(一個接一個),這意味着我需要跳過一個發送並繼續下一行 – 2013-02-13 06:01:32

回答

1

另一種方式:

awk -F "[:,]" '/=sent/{a[$2]=$0;}/=receive/{print a[$2], $0;delete a[$2];}END{for(i in a)print a[i],"NO MATCH";}' file 

結果:

abc message=sent session:111,x,y,z pqr message=receive session:111,4,5,7 
abc message=sent session:123,x,y,z pqr message=receive session:123,4,5,7 
abc message=sent session:589,x,y,z pqr message=receive session:589,4,5,7 
abc message=sent session:342,x,y,z NO MATCH 

當遇到send記錄,它是與會話ID作爲索引在數組中存儲。遇到receive記錄時,將從陣列中提取send記錄並與receive記錄一起打印。另外,當收到記錄時,發送的記錄將從陣列中刪除。在END中,數組中所有剩餘的記錄都被打印爲NO MATCH。

+0

非常感謝這..但我不能理解邏輯..你能解釋一下嗎 – 2013-02-13 06:54:01

+0

更新了評論 – Guru 2013-02-13 07:00:36

+0

這真的很容易理解..謝謝大師 – 2013-02-13 07:14:37

1

下面是使用awk的一種方式。的script.awk

awk -f script.awk file 

內容:

{ 
    x = $0 

    gsub(/[^:]*:|,.*/,"") 

    a[$0] = (a[$0] ? a[$0] "," FS : "") x 
    b[$0]++ 
} 

END { 
    for (i in a) { 
     print (b[i] == 2 ? a[i] : a[i] "," FS "NOMATCH") | "sort" 
    } 
} 

結果:像運行

abc message=sent session:111,x,y,z, pqr message=receive session:111,4,5,7 
abc message=sent session:123,x,y,z, pqr message=receive session:123,4,5,7 
abc message=sent session:342,x,y,z, NOMATCH 
abc message=sent session:589,x,y,z, pqr message=receive session:589,4,5,7 

另外,這裏是一個班輪:

awk '{ x = $0; gsub(/[^:]*:|,.*/,""); a[$0] = (a[$0] ? a[$0] "," FS : "") x; b[$0]++ } END { for (i in a) print (b[i] == 2 ? a[i] : a[i] "," FS "NOMATCH") | "sort" }' file 

注意,您可以降管道到sort如果你不關心排序輸出。 HTH。

+0

你好史蒂夫..請你解釋一下邏輯和我們爲什麼要排序結束? – 2013-02-14 09:56:27