$ cat pm_1193237_input.fasta
>qwerty|111|222|999
AAAAAAAAAA
>asdfgh|333|444|888
CCCCCCCCCC
>zxcvbn|555|666|777
GGGGGGGGGG
>plokmi|777|888|666
TTTTTTTTTT
>qwerty|111|222|555
AAAAAAAAAA
>asdfgh|333|444|444
CCCCCCCCCC
>zxcvbn|555|666|333
GGGGGGGGGG
>plokmi|777|888|222
TTTTTTTTTT
####
#!/usr/bin/env perl
use strict;
use warnings;
use autodie;
my $infile = 'pm_1193237_input.fasta';
{
my $out_fh;
open my $in_fh, '<', $infile;
while (<$in_fh>) {
my $pos = index $_, '|';
if ($pos == -1) { # Sequence
print $out_fh $_;
}
else { # Header
print { get_fh(\$out_fh, substr $_, 1, $pos - 1) } $_;
}
}
close $in_fh;
}
close_out_fhs();
{
my %fh_for;
sub get_fh {
my ($fh, $name) = @_;
unless (exists $fh_for{$name}) {
open $fh_for{$name}, '>', gen_fname($name);
}
$$fh = $fh_for{$name};
}
sub close_out_fhs { close $_ for values %fh_for }
}
sub gen_fname { 'pm_1193237_output_' . $_[0] . '.fasta' }
####
$ cat pm_1193237_output_qwerty.fasta
>qwerty|111|222|999
AAAAAAAAAA
>qwerty|111|222|555
AAAAAAAAAA
$ cat pm_1193237_output_asdfgh.fasta
>asdfgh|333|444|888
CCCCCCCCCC
>asdfgh|333|444|444
CCCCCCCCCC
$ cat pm_1193237_output_zxcvbn.fasta
>zxcvbn|555|666|777
GGGGGGGGGG
>zxcvbn|555|666|333
GGGGGGGGGG
$ cat pm_1193237_output_plokmi.fasta
>plokmi|777|888|666
TTTTTTTTTT
>plokmi|777|888|222
TTTTTTTTTT