1

Input - file1.txt

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
pqr message=receive session:123,4x,5x,7x
pqr message=receive session:123,4p,5q,7r
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

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

Notes:

  1. Find sent and its immediate receive - for only MATCHING session number
  2. Combine all session match "receive" with same "sent". For example: session:123
  3. If no "receive" then print NOMATCH
Vipin Choudhary
  • 331
  • 1
  • 2
  • 16
  • Is it not the same question which you had asked earlier? http://stackoverflow.com/questions/14847251/awk-merge-line-on-the-basis-of-field-matching – Guru Mar 06 '13 at 06:07
  • No.. This time we are trying to merge all lines on matching criteria.. previosuly we were merging only 2 lines. I know its kind of same but I tried to modify previous post but didnt succeeded. – Vipin Choudhary Mar 06 '13 at 06:09
  • @VipinChoudhary, why did you remove the `pqr` during the first merge but not the others? – perreal Mar 06 '13 at 06:15
  • Sorry.. That was typo.. correcting now – Vipin Choudhary Mar 06 '13 at 06:20

2 Answers2

2

Try this:

awk -F "[:,]"  '{split($2,a,",");if($1~/sent/){if(prev!~/receive/&& NR!=1)print prev,"NOMATCH";else if (NR!=1)print prev;prev=$0;session=a[1];}if($1~/receive/&&session==a[1]){prev=prev","$0;}}'END'{if(prev~/receive/)print prev;}' file1.txt
1
awk '{x=substr($3,0,match($3,","));a[x]?a[x]=a[x]","$0:a[x]=$0}END{for(i in a){print a[i],a[i]~/sent/&&a[i]~/receive/?"":"NOMATCH"}}' your_file

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
pqr message=receive session:123,4x,5x,7x
pqr message=receive session:123,4p,5q,7r
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
> 
> 
> 
> awk '{x=substr($3,0,match($3,","));a[x]?a[x]=a[x]","$0:a[x]=$0}END{for(i in a){print a[i],a[i]~/sent/&&a[i]~/receive/?"":"NOMATCH"}}' 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,pqr message=receive session:123,4x,5x,7x,pqr message=receive session:123,4p,5q,7r 
abc message=receive session:311,x,y,z NOMATCH
abc message=sent session:589,x,y,z,pqr message=receive session:589,4,5,7 
abc message=sent session:342,x,y,z NOMATCH
> 
Vijay
  • 65,327
  • 90
  • 227
  • 319