-1

I need help with following:

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

Output 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:342,x,y,z, NOMATCH
abc message=sent session:589,x,y,z, pqr message=receive session:589,4,5,7

Notes:

If you see in source file, for every "sent" message there is "receive"
For every "=sent", search for "=receive" in immediate NEXT LINE ONLY for same session number
So merge only those sent and receive where we have matching session number ELSE print the sent as it is in a sequence
only for session=342 there is no receive
session is unknow, can't be hardcoded

Vipin Choudhary
  • 331
  • 1
  • 2
  • 16
  • possible duplicate of [awk | merge line on the basis of field matching](http://stackoverflow.com/questions/14847251/awk-merge-line-on-the-basis-of-field-matching) – Vijay Feb 14 '13 at 12:54
  • 1
    why do you keep asking the same question multiple times even after you have accepted the previous question aceepted by you.? – Vijay Feb 14 '13 at 12:55
  • Sorry if I rephrased it wrong, but this is bit different from the old one.. Here I want to bring logic of matching sent and its receive in IMMEDIATE next line. – Vipin Choudhary Feb 14 '13 at 14:26

1 Answers1

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

tested:

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

or you could simply put the code in a file as below:

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

and execute as below:

> 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
> 
Vijay
  • 65,327
  • 90
  • 227
  • 319
  • Thanks Sarathi.. I checked this code.. It worked fine.. but if we add one more line (with sent) in it then its not printing as NO match against it and skipping that line.. For example: 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 aaa message=sent session:555,1,a,1 Then it will skip last line with 555 session – Vipin Choudhary Feb 14 '13 at 14:31