#!/usr/bin/env perl use strict; use warnings; my %res; { local $/ = "\n>"; while (my $record = ) { chomp $record; $record = substr $record, 1 if $. == 1; $record =~ s/\s*\z//m; my ($id, $anno_seq) = split /\|/, $record, 2; push @{$res{$anno_seq}}, $id; } } print '>', join('|', (sort @{$res{$_}}), $_), "\n" for sort { $res{$a}[0] cmp $res{$b}[0] } keys %res; __DATA__ >id7|anno2 GHI >id1|anno1 ABC >id6|anno1 ABC >id4|anno2 GHI >id2|anno3 DEF >id3|anno1 ABC >id5|anno1 ABC