2013-02-13 50 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