my %seen;
for ( reverse <DATA> ) {
( my $unstarred = $_ ) =~ s/\*\*/ /;
print unless $seen{ $unstarred }++;
}
__DATA__
30380868 N Sep 29 356200 AGEC682569 ATI
+ S
30380868 ** N Sep 29 356200 AGEC682569 ATI
+ S
71130740 N Sep 7 SM9481 AGEC683966 ATI
+ S
71130740 ** N Sep 7 SM9481 AGEC683966 ATI
+ S
32450045 N Jul 14 SN9672 AGEC685203 ATI
+ S
32450045 ** N Jul 14 SN9672 AGEC685203 ATI
+ S
36450223 N Aug 30 SU8329 AGEC685348 ATI
+ S
34680135 N Sep 30 349450 AGEC685442 ATI
+ S
The only difference from your 'desired output' is that this code prints it out in reverse order. But I don't see this as a problem, as there seems to be no inherent order in the input/output anyway...