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

如何在perl中计算txt文件中的记录,perl,Perl,我是perl新手,在计算一个文件中的记录时遇到了问题,因为我的文件中有不同的组顺序排列,我希望将它们放入从AC到//的记录中,由1条记录组成。你能帮我吗提前谢谢你 输入文件: // AC T00001 FA AAF OS human, Homo sapiens // AC T00002 FA ACE2 OS yeast, Saccharomyces cerevisiae SQ MDNVVDPWYINPSGFAKDTQDEEYVQHHDNVNPTIPPPDNYILNNENDDGLDN

我是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
//

您应该能够更改输入记录分隔符(请参阅):

$/='/';
而()
{
#记录在$中,现在用它做点什么。。。
}
编辑:如果你的目标仅仅是统计记录,你可以做一些像

my @lines = <>;
my @lines_with_ac = grep { /^AC/ } @lines;
my $number_of_records = scalar @lines_with_ac;
my@lines=;
我的@lines\u与@u ac=grep{/^ac/}@lines;
my$number_of_records=标量@lines_与_ac;

您应该能够更改输入记录分隔符(请参阅):

$/='/';
而()
{
#记录在$中,现在用它做点什么。。。
}
编辑:如果你的目标仅仅是统计记录,你可以做一些像

my @lines = <>;
my @lines_with_ac = grep { /^AC/ } @lines;
my $number_of_records = scalar @lines_with_ac;
my@lines=;
我的@lines\u与@u ac=grep{/^ac/}@lines;
my$number_of_records=标量@lines_与_ac;

此脚本将计算文件中存在的
/
终止记录数:

#!/usr/bin/perl

$/ = '//';
open FH, "/path/to/my/file";
my $count;
while (<FH>) {
    $count++;
}
close FH;
print "$count records\n";
#/usr/bin/perl
$/ = '//';
打开FH,“/path/to/my/file”;
我的$count;
而(){
$count++;
}
关闭FH;
打印“$count记录\n”;

请注意,在这种情况下可能会出现+1错误,因为文件以
/
开头——这意味着它读取的第一条“记录”将为空。如果这是一个问题,只需从最终结果中减去一个即可。

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

#!/usr/bin/perl

$/ = '//';
open FH, "/path/to/my/file";
my $count;
while (<FH>) {
    $count++;
}
close FH;
print "$count records\n";
#/usr/bin/perl
$/ = '//';
打开FH,“/path/to/my/file”;
我的$count;
而(){
$count++;
}
关闭FH;
打印“$count记录\n”;

请注意,在这种情况下可能会出现+1错误,因为文件以
/
开头——这意味着它读取的第一条“记录”将为空。如果这是一个问题,只需从最终结果中减去一个即可。

如果文件名为test.data,请在命令行中键入此项

cat test.dat | perl -ne 'print if /^AC/;' | wc -l
它打印以AC开头的行数计数。这假设所有记录都以AC开头,术语AC仅用作记录的开头

您也可以在完全不使用perl的情况下执行此操作:

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

命令行非常有趣。

如果您的文件名为test.data,请在命令行中键入此命令

cat test.dat | perl -ne 'print if /^AC/;' | wc -l
它打印以AC开头的行数计数。这假设所有记录都以AC开头,术语AC仅用作记录的开头

您也可以在完全不使用perl的情况下执行此操作:

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

命令行非常有趣。

运行它: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"
}
使用警告;
严格使用;
使用数据::转储程序;
我的@记录;
我的$i=0;
而()
{
如果(/^AC/./\/\//){
咀嚼;
/\/\//?$i++:push@{$records[$i]},$\;
}
}
foreach(0..$#记录){
打印“记录”、$\u1、:\n\n;
打印转储程序$records[$\uz];
打印“\n\n”
}

运行它: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"
}
使用警告;
严格使用;
使用数据::转储程序;
我的@记录;
我的$i=0;
而()
{
如果(/^AC/./\/\//){
咀嚼;
/\/\//?$i++:push@{$records[$i]},$\;
}
}
foreach(0..$#记录){
打印“记录”、$\u1、:\n\n;
打印转储程序$records[$\uz];
打印“\n\n”
}

根据我得到的信息,您希望创建ID为AC值并以//字符串结尾的记录

下面的脚本将获取所有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";
#/usr/bin/perl
严格使用;
使用警告;
使用数据::转储程序;
我的@行;
我的%hash;
我的$opId;

打开我的$input_fh,“根据我得到的信息,你想要创建一个记录,记录ID为AC值,最后以//字符串结束

下面的脚本将获取所有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";
!/usr/bin/perl
严格使用;
使用警告;
使用数据::转储程序;
我的@行;
我的%hash;
我的$opId;


打开我的$input\u fh,“你是将SQ作为记录计算,还是那些分隔符?你想计算什么?听起来你也在尝试分类?啊,问题的重新格式化很好。因此,如果你计算以AC开头的行数,这是否是“记录数”的准确计数?很可能你需要将其读入哈希数组。你是将SQ作为记录计数,还是这些分隔符?你想计算什么?听起来你也在尝试分类?啊,问题的重新格式化很好。因此,如果你计算以AC开头的行数,这是“记录数”的准确计数吗?很可能你需要将其读入哈希数组中。我想将AC放入记录中,然后检查我的文件中有多少记录。谢谢大家help@soniya:使用我上面的第一个解决方案,或@Flimzy's。更改输入记录分隔符也会使整个文件中的
/
成为元字符,因此,如果任何记录包含此类字符,将损坏数据库。我想在记录中添加AC to/,然后检查文件中有多少条记录。感谢大家的支持help@soniya:使用我上面的第一个解决方案,或者@Flimzy's。更改输入记录分隔符也会使整个文件中的
/
成为元字符,因此,如果任何记录包含此类分隔符,将损坏数据库。正如我在Platinum的回答中所评论的,这将使
/
成为整个文件中的元字符,如果它存在于记录末尾以外的任何位置,则会导致损坏。显然,在记录分隔符以外的位置使用
//
分隔的文件将导致问题。如果发生这种情况,我会考虑该文件,而不是在解析器中。不过,为了帮助解决这个问题,您可能会设置“$/=”\n//\n”。正如我在Platinum的回答中所评论的,这将使
/
成为整个系统中的元字符