awk repeat one field at all lines and modify field repetitions

Hello experts

I have a file with paragraphs begining with a keeping date and ending with "END":

20120301 num num
John        num num A keepnum1 num num
kathrin     num num A keepnum1 num num
kathrin     num num B keepnum2 num num
Pete        num num A keepnum1 num num
Jacob       num num A keepnum1 num num
Jacob       num num B keepnum2 num num
END
20111203 num num
Eva        num num A keepnum1 num num
Adam       num num A keepnum1 num num
Adam       num num B keepnum2 num num       
Jacob      num num A keepnum1 num num
Jacob      num num B keepnum2 num num
END
...

where "num"=random number that will be discarded, keepnum=keeping random number
What I want is

  1. to repeat the date in all lines of each paragraph before keepnum1
  2. to take the B keepnum2 of each duplicate name and place it in the first accuring line.
    So that the output would look like:
John        A 20120301 keepnum1 
kathrin     A 20120301 keepnum1  B keepnum2 
Pete        A 20120301 keepnum1 
Jacob        A 20120301 keepnum1  B keepnum2 
END
20111203 
Eva        A 20111203 keepnum1 
Adam      A 20111203  keepnum1  B keepnum2       
Jacob     A 20111203 keepnum1 B keepnum2 
END
....

I have only managged to take the dates with the following command

 awk ' {RS="END"}; {print $1};' 

But with no further luck. Any suggestions? (OS Opensuse)

The following seems to do what you want, but since your output format is not consistent (no date before first output group, inconsistent spacing), I'm not sure if this is what you want:

awk '
!head {	print date = $1
	head = 1
	last = ""
	next
}
/^END/ {head = 0
	if(last != "")
		print ""
	print "END"
	next
}
$1 != last {
	if(last != "")
		print ""
	printf("%s\tA %s %s", last = $1, date, $5)
	next
}
{	# To get here, $1 on this line and $1 on the previous line must match...
	printf("\tB %s", $5)
}' file

which, if file contains your sample input, produces the output:

20120301
John	A 20120301 keepnum1
kathrin	A 20120301 keepnum1	B keepnum2
Pete	A 20120301 keepnum1
Jacob	A 20120301 keepnum1	B keepnum2
END
20111203
Eva	A 20111203 keepnum1
Adam	A 20111203 keepnum1	B keepnum2
Jacob	A 20111203 keepnum1	B keepnum2
END

If someone wants to try this on a Solaris/SunOS system, change awk to /usr/xpg4/bin/awk or nawk .

1 Like

Thank you very much! it worked! Have no words!