Получение данных из соответствия списку

Эти операторы не являются противоречащими, они оба верны. Вы или перепутываете названия дистрибутивов или определение включенных условий.

Вы, вероятно, путаете RH с RHEL. Былые времена Redhat и текущей очереди Fedora and Redhat Enterprise Linux очень отличаются.

RedHat Enterprise Linux является в основном профессионально перехешированной версией Fedora с контрактом на поддержку. CentOS является в основном подражателем RHEL без предложения контракта на поддержку.

Fedora независим от любого другого текущего распределения. На самом деле это - один из ведущих независимых дистрибутивов. Независимый означает, что это - разработка, автономная операция. Зависимый или на языке Distrowatch "на основе" дистрибутивов является, которые являются только модификациями других дистрибутивов и уверены в другой работе дистрибутивов, чтобы продолжить продвигаться.

Примером зависимого дистрибутива был бы CentOS, который полагается на переупаковку материала от RHEL. RHEL в свою очередь полагается на техническую разработку, сделанную на Fedora для продолжения. Монетный двор полагается на процесс разработки Ubuntu и просто слои на их собственных изменениях.

0
30.08.2012, 18:08
2 ответа

При небольшом изменении решения, предоставленного Gilles в этом вопросе (также упомянутый jw013), можно получить эффект, который Вы просите, за исключением того, что порядок основан на входной последовательности и не идентичный output.txt перечисленный в Вашем вопросе:

awk -v patterns_file=list.txt '
BEGIN {
  while (getline < patterns_file)
    patterns_array[">" $0] = 1
  close(patterns_file)
}
$0 in patterns_array { print; getline; print }
' sample[1-3].txt

Вывод:

>GETID_17049_knownids_1/2_Confidence_0.625_Length_2532
sampletextforsample1
>GETID_11084_knownids_3/3_Confidence_0.600_Length_1451
sampletextforsample2
>GETID_17049_knownids_1/2_Confidence_0.625_Length_2532
sampletextforsample3
>GETID_15916_knownids_10/11_Confidence_0.324_Length_1825
sample2textforsample3

Править

Заставить эту работу с многострочными записями использовать соответствующий разделитель записей (RS), в Вашем случае, устанавливающем его на: greater-than в начале файла (^>) или new-line сопровождаемый greater-than (\n>) или new-line в конце файла (\n$) походите на хороший выбор на основе обеспеченного входа.

Что-то вроде этого должно работать:

awk -v patterns_file=patterns.txt '
BEGIN {
  while (getline < patterns_file) 
    patterns_array[$0] = 1
  close(patterns_file)
  RS="^>|\n>|\n$"
}
$1 in patterns_array { print ">" $0 }
' sample[1-3].txt

Редактирование 2

Для вывода каждой записи только однажды удалите его из patterns_array после того, как произведено:

awk -v patterns_file=patterns.txt '
BEGIN {
  while (getline < patterns_file) 
    patterns_array[$0] = 1
  close(patterns_file)
  RS="^>|\n>|\n$"
}
$1 in patterns_array { print ">" $0; delete patterns_array[$1] }
' sample[1-3].txt
1
28.01.2020, 02:38
  • 1
    Посмотрите редактирование к ответу. –  Thor 30.08.2012, 18:08
  • 2
    теперь это работает. ouput печатает без'>' символ. Также вывод должен содержать точное количество как в list.txt. –  jack 30.08.2012, 18:42
  • 3
    Забыл повторно добавлять>, зафиксированный. Что Вы подразумеваете под точным количеством? –  Thor 30.08.2012, 18:55
  • 4
    говорит, должен ли счет'>' в list.txt, вывод также содержать тот же счет'>', даже существует повторение в списке или образце –  jack 30.08.2012, 19:06
  • 5
    Просто удалите их из patterns_array после того, как произведено. Я добавлю редактирование. –  Thor 30.08.2012, 19:17

Вот решение для Perl. Это будет работать на любое количество файлов и ожидает, что первый файл будет списком. Это также добавит имя файла к заголовку FASTA.

#!/usr/bin/perl -w
use strict;
my $list=shift;
open(A,$list); 
my %k;
while(<A>){
    ## Remove trailing newline
    chomp;
    if ( /(\d+?)_knownids_(.+?)_.+?(\d+)$/){ 
      ## Concatenate the patterns and save in a hash
      my $pp=join("-", $1,$2,$3);
      $k{PAT}{$pp}=$_;
    }
}
close(A);
## Read each input file
my $name;
for my $f (@ARGV) {
    open(F,$f);
    while(<F>){
       ## Skip empty lines
       next if /^\s*$/;
       ## Is this a FASTA header?
       if ( /^\s*>/){
           ## If this id is in the list, keep it for this file
           if(/(\d+?)_knownids_(.+?)_.+?(\d+)$/){ 
              $name=join("-", $1,$2,$3);
           }
           ## Skip the sequences we are not interested in
           else{$name="foo"}
       }
       ## Collect the sequence
       else {
           if (defined($k{PAT}{$name})) {
           $k{$f}{$name}.=$_;
           }   
       } 
    }
    close(F);
}
## For each unique pattern found in list.txt
foreach my $pat (keys(%{$k{PAT}})) {
    ## For each of the files passed as arguments
    foreach my $file (@ARGV) {
    ## If the pattern was found in that file, print
    if (defined($k{$file}{$pat})) {
          print ">$k{PAT}{$pat}_$file\n";  
          print "$k{$file}{$pat}"
        }
    }
}

Если сценарий сохраняется как compare.pl, сделайте:

$ ./compare.pl list.txt sample1.txt sample2.txt sample3.txt sampleN.txt

Вывод:

> GETID_11084_knownids_3/3_Confidence_0.600_Length_1451_sample2.txt
sampletextforsample2
> GETID_17049_knownids_1/2_Confidence_0.625_Length_2532_sample1.txt
sampletextforsample1
> GETID_17049_knownids_1/2_Confidence_0.625_Length_2532_sample3.txt
sampletextforsample3
> GETID_15916_knownids_10/11_Confidence_0.324_Length_1825_sample3.txt
sample2textforsample3
1
28.01.2020, 02:38
  • 1
    там является некоторым warning:Use неинициализированного значения в соединении или строке в строке 26. –  jack 30.08.2012, 18:02
  • 2
    @jack, то предупреждение, вероятно, означает, что у Вас есть заголовок FASTA, который не содержит "knownids". Я отредактировал сценарий для предотвращения этих ошибок. Удостоверьтесь, что ВСЕ Ваши заголовки FASTA соответствуют шаблону, который Вы дали в Вас вопросу. –  terdon♦ 30.08.2012, 18:23
  • 3
    Thanks.now это работает. Мне нужны точные количества как в list.txt, даже образцы содержат идентичные идентификаторы. –  jack 30.08.2012, 18:41

Теги

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