2013-02-14 55 views
-1

我需要幫助與以下:awk |合併連續2行場匹配的基礎上的文件

輸入文件:

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=receive session:311,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 

注:

如果您在源文件中看到,對於每個「發送」消息,都有「接收」
對於每個「=發送」,搜索f或「=接收」在立即下一行僅適用於相同的會話號碼
因此,只合並那些發送和接收,我們有匹配的會話號碼ELSE打印發送,因爲它是在一個序列
只有會話= 342有沒有收到
會話不明,不能硬編碼

+0

可能重複|在字段匹配的基礎上合併行](http://stackoverflow.com/questions/14847251/awk-merge-line-on-the-basis-of-field-matching) – Vijay 2013-02-14 12:54:25

+1

爲什麼你一直問相同的問題多個即使你已經接受了你提出的上一個問題。 – Vijay 2013-02-14 12:55:10

+0

對不起,如果我把它改錯了,但這是與舊的有點不同。在這裏我想帶來匹配的邏輯發送和IMMEDIATE下一行接收。 – 2013-02-14 14:26:31

回答

0
awk 
'{ 
split($3,a,","); 
if($2~/sent/) 
{ 
    if(prev!~/receive/ && NR!=1) 
    print prev,"NO MATCH";prev=$0;session=a[1]; 
} 
if($2~/receive/&&session==a[1]) 
{ 
    print session, prev,$0;prev=$0 
} 
}' temp 

測試:

> cat temp 
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 

> awk '{split($3,a,",");if($2~/sent/){if(prev!~/receive/&& NR!=1)print prev,"NO MATCH";prev=$0;session=a[1];}if($2~/receive/&&session==a[1]){print session, prev,$0;prev=$0}}' temp 
session:111 abc message=sent session:111,x,y,z pqr message=receive session:111,4,5,7 
session:123 abc message=sent session:123,x,y,z pqr message=receive session:123,4,5,7 
abc message=sent session:342,x,y,z NO MATCH 
session:589 abc message=sent session:589,x,y,z pqr message=receive session:589,4,5,7 
> 

,或者你可以簡單地將代碼放在一個文件作爲貝羅女:

> cat tmp.awk 
#!/usr/bin/awk 

{ 
split($3,a,","); 
if($2~/sent/) 
{ 
    if(prev!~/receive/ && NR!=1) 
    print prev,"NO MATCH";prev=$0;session=a[1]; 
} 
if($2~/receive/&&session==a[1]) 
{ 
    print session, prev,$0;prev=$0 
} 
} 
> 

,並如下執行:

> awk -f tmp.awk temp 
session:111 abc message=sent session:111,x,y,z pqr message=receive session:111,4,5,7 
session:123 abc message=sent session:123,x,y,z pqr message=receive session:123,4,5,7 
abc message=sent session:342,x,y,z NO MATCH 
session:589 abc message=sent session:589,x,y,z pqr message=receive session:589,4,5,7 
> 
[AWK的
+0

謝謝Sarathi ..我檢查了這個代碼..它工作正常..但如果我們添加一個更多的行(與發送)在它然後它不打印作爲NO匹配並跳過該行..例如:貓的溫度= abc message =發送會話:111,x,y,z pqr message =接收會話:111,4,5,7 abc message =發送會話:123,x,y,z pqr message = receive session:123, 4,5,7 abc message =發送會話:342,x,y,z abc message =發送會話:589,x,y,z pqr message =接收會話:589,4,5,7 aaa消息=發送會話:555,1,a,1 然後它將跳過555會話的最後一行 – 2013-02-14 14:31:08