Você pode criar um hash perl
das linhas do segundo arquivo
#!/usr/bin/perl -w
use strict;
BEGIN{ $/ = $\ = "\n"; }
my $stringsfile = shift @ARGV;
open(my $fh, '<:encoding(UTF-8)', $stringsfile)
or die "Could not open file '$stringsfile' $!";
my %h;
while (defined($_ = <$fh>)) {
chomp $_;
$h{$_} = 1;
}
e, em seguida, divida as linhas dos primeiros (e subseqüentes) arquivos em campos separados por hífen, grep para os campos que não estão no hash e junte tudo novamente e imprima se o grep retornar alguma coisa:
while (defined($_ = <ARGV>)) {
chomp $_;
my ($x, @F) = split(/_/, $_, 0);
my @y = grep({not $h{$_};} @F);
print join('_', $x, @y) if @y;
}
Uso:
$ ./foo.pl file2 file1
1A00.pdb_HEM
1A01.pdb_HEM
1A05.pdb_IPM
1A0F.pdb_GTS
1A0G.pdb_PMP
Nota: se as correspondências potenciais estiverem todas no final, há uma abordagem muito mais simples usando awk
:
awk '
BEGIN{OFS=FS="_"}
NR==FNR {a[$0]++; next}
{while ($NF in a) NF--}
NF>1 {print}
' file2 file1
Para os dados de amostra da sua pergunta, as duas abordagens produzem o mesmo resultado.