Выборочно объединяющееся содержание файла

Я должен соответствовать двум файлам и распечатать только те строки, что после определенного символа не сопровождаются только элементами из одного из файла.

например, у меня есть два файла, которые похожи на это:

 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).

У кого-либо есть какая-либо идея, как сделать это?

0
задан 25 January 2018 в 00:53

1 ответ

Вы могли создать 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

Для демонстрационных данных в Вашем вопросе оба подхода производят тот же вывод.

0
ответ дан 31 October 2019 в 03:31

Другие вопросы по тегам:

Похожие вопросы: