Я должен соответствовать двум файлам и распечатать только те строки, что после определенного символа не сопровождаются только элементами из одного из файла.
например, у меня есть два файла, которые похожи на это:
1A00.pdb_HEM_COA
1A01.pdb_HEM
1A05.pdb_IPM
1A0F.pdb_GTS_4CA
1A0G.pdb_PMP
1A0I.pdb_2CP
и это:
COA
2CP
3CP
3HC
4CA
4CO
Я хочу соответствовать им и если это появляется это сначала _
только сопровождается элементами из второго файла, затем не печатают их (пример 1A0I.pdb_2CP
). Если в других строках это появляется это _
сопровождается некоторый другой элемент, но также и элементом из второго файла также затем просто удаляет этот элемент, который является общим в обоих файлах, но распечатайте строку (пример 1A00.pdb_HEM_COA
и распечатанная строка должна быть похожей 1A00.pdb_HEM
).
У кого-либо есть какая-либо идея, как сделать это?
Вы могли создать a perl
хеш от строк второго файла
#!/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;
}
и затем строки разделения первого (и последующий) файлы в разделенные от дефиса поля, grep для тех полей, которые не находятся в хеше и присоединяются ко всему этому назад вместе и печать, если grep возвращает что-нибудь:
while (defined($_ = <ARGV>)) {
chomp $_;
my ($x, @F) = split(/_/, $_, 0);
my @y = grep({not $h{$_};} @F);
print join('_', $x, @y) if @y;
}
Использование:
$ ./foo.pl file2 file1
1A00.pdb_HEM
1A01.pdb_HEM
1A05.pdb_IPM
1A0F.pdb_GTS
1A0G.pdb_PMP
Примечание: если потенциальные соответствия - все в конце, то существует намного более простое использование подхода awk
:
awk '
BEGIN{OFS=FS="_"}
NR==FNR {a[$0]++; next}
{while ($NF in a) NF--}
NF>1 {print}
' file2 file1
Для демонстрационных данных в Вашем вопросе оба подхода производят тот же вывод.