Как посчитать записи из txt файла в perl - PullRequest
1 голос
/ 09 июля 2011

Я новичок в Perl, и у меня возникла проблема с подсчетом записей в файле, так как в моем файле последовательно расположены различные группы, и я хочу поместить их в записи, начиная от AC до //, состоящие из 1 записи.Можете ли вы помочь мне .. Спасибо заранее ...

Входной файл:

//
AC  T00001
FA  AAF
OS  human, Homo sapiens
//
AC  T00002
FA  ACE2
OS  yeast, Saccharomyces cerevisiae
SQ  MDNVVDPWYINPSGFAKDTQDEEYVQHHDNVNPTIPPPDNYILNNENDDGLDNLLGMDYY
//
AC  T00003
FA  AS-C T3
OS  fruit fly, Drosophila melanogaster
SQ  MTSICSSKFQQQHYQLTNSNIFLLQHQHHHQTQQHQLIAPKIPLGTSQLQNMQQSQQSNV
SQ  GPMLSSQKKKFNYNNMPYGEQLPSVARRNARERNRVKQVNNGFVNLRQHLPQTVVNSLSN
SQ  GGRGSSKKLSKVDTLRIAVEYIRGLQDMLDDGTASSTRHIYNSADESSNDGSSYNDYNDS
SQ  LDSSQQFLTGATQSAQSRSYHSASPTPSYSGSEISGGGYIKQELQEQDLKFDSFDSFSDE
SQ  QPDDEELLDYISSWQEQ
//
AC  T00004
FA  Sc
OS  fruit fly, Drosophila melanogaster
SQ  MKNNNNTTKSTTMSSSVLSTNETFPTTINSATKIFRYQHIMPAPSPLIPGGNQNQPAGTM
SQ  PIKTRKYTPRGMALTRCSESVSSLSPGSSPAPYNVDQSQSVQRRNARERNRVKQVNNSFA
SQ  RLRQHIPQSIITDLTKGGGRGPHKKISKVDTLRIAVEYIRSLQDLVDDLNGGSNIGANNA
//

Ответы [ 5 ]

2 голосов
/ 09 июля 2011

Вы должны просто иметь возможность изменить разделитель входной записи (см. perlvar ):

$/ = '//';
while (<>)
{
    # record is in $_, now do something with it...
}

РЕДАКТИРОВАТЬ: Если ваша цель просто подсчитатьзаписи, вы могли бы сделать что-то вроде ...

my @lines = <>;
my @lines_with_ac = grep { /^AC/ } @lines;
my $number_of_records = scalar @lines_with_ac;
1 голос
/ 09 июля 2011

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

Следующий скрипт получит все идентификаторы T ** и создаст хеш-значение для каждого из них. Последняя строка позволяет подсчитать, сколько записей в этом хэше.

#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

my @lines;
my %hash;
my $opId;

open my $input_fh, "<", 'so.input';
chomp(@lines = <$input_fh>);
close $input_fh;

foreach (@lines) {
    if (/(?<ctrl>.{2})(\s+)(?<value>.*)/) {
        if ($+{ctrl} eq 'AC') {
            $opId = $+{value};
        }   
        $hash{$opId}{$+{ctrl}} .= $+{value};
    }   
}

my @records = keys %hash;

print Dumper(%hash);
print @records . " records had been found on this file\n";

Надеюсь, это было то, что вы спросили,

1 голос
/ 09 июля 2011

запустите: perl script.pl inputfile

use warnings;
use strict;
use Data::Dumper;

my @records;

my $i = 0;
while (<>)
{
  if (/^AC/../\/\//){
    chomp;
    /\/\// ? $i++ : push @{$records[$i]},$_;
  }
}

foreach (0 .. $#records){
  print "record", $_+1, ":\n\n";
  print Dumper $records[$_];
  print "\n\n"
}
1 голос
/ 09 июля 2011

Этот скрипт подсчитает, сколько // -определенных записей существует в вашем файле:

#!/usr/bin/perl

$/ = '//';
open FH, "/path/to/my/file";
my $count;
while (<FH>) {
    $count++;
}
close FH;
print "$count records\n";

Обратите внимание, что в этом случае вы можете получить ошибку +1, поскольку ваш файл начинается с с // - это означает, что первая «запись», которую он читает, будет пустой. Если это проблема, просто вычтите одну из конечного результата.

0 голосов
/ 09 июля 2011

Если ваш файл был назван test.data, введите его в командной строке

cat test.dat | perl -ne 'print if /^AC/;' | wc -l

Он печатает количество строк, начинающихся с AC.Это предполагает, что все записи начинаются с AC, а термин AC используется только в качестве начала записи.

Вы также можете сделать это вообще без perl:

cat test.dat | egrep "^AC" | wc -l

Командная строкаочень весело.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...