This is because you didn't describe your problem well enough. I mean, you know what you have and you know what you would like to get out of it, but as far as i can see you haven't thought through what it would take to get from here to there. There is noprogramming involved, just plain thinking:
You have this:
gene1 GO:0016491|GO:0055114
gene2 GO:0004665|GO:0006571|GO:0008977|GO:0055114
gene3 GO:0005515
gene4 GO:0016491|GO:0055114
gene5 GO:0004427|GO:0009678|GO:0015992|GO:0016020
and want to get this:
gene1. GO:0016491
gene1 GO:0055114
gene2 GO:0004665
gene2 GO:0006571
gene2 GO:0008977
gene2 GO:0055114
Now, first step is: which lines of the outcome are correlated to which input? Obvious this line:
gene2 GO:0004665|GO:0006571|GO:0008977|GO:0055114
accounts for these:
gene2 GO:0004665
gene2 GO:0006571
gene2 GO:0008977
gene2 GO:0055114
I suppose the reason why "gene3", "gene3" and "gene5" are missing from what you showed as output is that it is simply a sample and you did cut somewhere - yes? Or are there filters in place you haven't told us about? If so, which ones?
Now, concentrating on transforming the one line, what did we find:
1) the input line has a first field (like "gene1", "gene2", etc.), which should show up as first part of the respective output line(s). The field is delimited by the start of the line and the first tab character, if i interpret your data correctly.
2) The second field consists of several sub-fields which are delimited by pipe characters ("|"). For every such sub-field there should be a separate line in the output with the first field and the respective sub-field.
If this is correct as i described it the necessary code to implement it already "springs out" of that, no? So try that and show your efforts, then we will go over what you have written and - if necessary - correct it. Some questions you should answer for yourself, though, just to know if you have to guard against such possibilities in your code:
a) Could there be input lines with no second fields, like "gene2" here:
gene1 GO:0016491|GO:0055114
gene2
gene3 GO:0005515
And, if yes, what do you want to do with them?
b) will the sub-fields in the second field always be of this form ("G"-"O"-":" plus 6 digits 0-9) or might there be something else, like:
gene1 GO:0016491|who knows|GO:0055114
If yes, what should be done with these?
c) could there be "double entries" like one of these:
gene1 GO:0016491|GO:0016491
gene2 GO:0005515
gene2 GO:0005515
Again, if yes: what do you want to do with these?
d) What about long lines? Might it happen that the line has so many sub-fields that it is broken into the next line like this:
gene1 GO:0016491|GO:0016492|GO:0016493|GO:0016494|GO:0016495|....(a long line)
GO:0016600|GO:0016601
I am sure you get what this aims at and you surely know your data better than me, so maybe some of my points are moot - but it pays to make oneself aware of the point being moot. So sit down, analyse your problem, try to write some code and show it here. We gladly help, but we help you help yourself, we won't do your work for you.
I hope this helps.
bakunin