awk |在字段匹配的基础上合并文件中的连续两行

awk |在字段匹配的基础上合并文件中的连续两行,awk,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=receive session:311,x,y,z abc message=s

我需要以下方面的帮助:

输入文件:

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
注:

如果您在源文件中看到,对于每个“已发送”消息,都有“接收”
对于每一个“=已发送”,仅在下一行中搜索相同会话号的“=接收”
因此,只合并那些发送和接收的会话号匹配的会话号,否则按顺序打印发送的会话号
仅对于会话=342,没有接收
会话未知,无法硬编码

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
> 
并按如下方式执行:

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

可能重复的问题:即使你已经接受了之前的问题,为什么你仍然多次问同一个问题?对不起,如果我把它改错了,但这与以前的问题有点不同。。在这里,我想在下一行中显示匹配发送和接收的逻辑。谢谢Sarathi。。我查过这个密码。。它工作得很好。。但是,如果我们在其中再添加一行(带有sent),那么它就不会打印,因为它与该行不匹配并跳过该行。。例如:cat temp=abc消息=发送会话:111,x,y,z pqr消息=接收会话:111,4,5,7 abc消息=发送会话:123,x,y,z pqr消息=接收会话:123,4,5,7 abc消息=发送会话:342,x,y,z abc消息=发送会话:589,x,y,z pqr消息=接收会话:589,4,5,7 aaa消息=发送会话:555,1,a,1然后它将跳过555会话的最后一行