如何计算perl中txt文件中的记录

时间:2011-07-08 21:07:35

标签: perl

我是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 个答案:

答案 0 :(得分:2)

您应该只能更改输入记录分隔符(请参阅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 :(得分:1)

此脚本将计算文件中存在多少//个已终止的记录:

#!/usr/bin/perl

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

请注意,在这种情况下,您可能会收到+1错误,因为您的文件//启动 - 这意味着它读取的第一个“记录”将为空。如果这是一个问题,只需从最终结果中减去一个。

答案 2 :(得分:1)

运行它: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"
}

答案 3 :(得分:1)

根据我得到的内容,你想要创建记录,其中包含AC值作为ID并以//字符串结束。

以下脚本将获取所有ID T * * ,并为每个ID创建一个哈希值。 最后一行允许您计算此哈希值中的记录数。

#!/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";

我希望这就是你的要求,

答案 4 :(得分:0)

如果您的文件名为test.data,请在命令行上输入

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

打印以AC开头的行数。这假定所有记录都以AC开头,而术语AC仅用作记录的开头。

您也可以在没有perl的情况下执行此操作:

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

命令行非常有趣。