The OP wanted the same number in front of each occurence of the same ID, not a slowly increasing number counting different IDs so far. This can be achieved with a hash storing unique numbers rather than repetition counts.
use warnings;
use strict;
my $counter = 0;
my %hash;
while (<DATA>) {
my @splits = split;
my $snp = $splits[0];
$hash{$snp} ||= ++$counter;
print "$hash{$snp} $snp\n";
}
__DATA__
foo abc
foo cde
bar xyz
foo hij
This should output:
1 foo
1 foo
2 bar
1 foo
... rather than:
1 foo
1 foo
2 bar
2 foo