我是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
//
答案 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
命令行非常有趣。