#!/usr/bin/env perl use strict; use warnings; my $seen; while ( <> ) { next unless /^\d/; s/\s*$//; next unless m/ # [file1] [file2] ^ (\S+) # PeptideID PeptideID \s+ (\S+) # ProteinID SpectrumID (?: \s+ (\S+) # ----- Sequence )? $ /x; if ( $3 ) { $seen->{$1}->{SpectrumID} = $2; $seen->{$1}->{Sequence} = $3; } else { push @{ $seen->{$1}->{ProteinID} }, $2; } } sub frmt { print join("\t", @_) . "\n"; } frmt qw( PeptideID ProteinID SpectrumID Sequence ); foreach my $k ( sort { $a <=> $b } keys %{ $seen } ) { foreach my $p ( @{ $seen->{$k}->{ProteinID} } ) { frmt $k, $p, $seen->{$k}->{SpectrumID}, $seen->{$k}->{Sequence}; } }