如何在perl中计算txt文件中的记录
我是perl新手,在计算一个文件中的记录时遇到了问题,因为我的文件中有不同的组顺序排列,我希望将它们放入从AC到//的记录中,由1条记录组成。你能帮我吗提前谢谢你 输入文件:如何在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
//
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的回答中所评论的,这将使/
成为整个系统中的元字符