我编写了一个脚本,用于比较多个文件并给出每个文件中每个段落的出现次数。该脚本可以正常使用较小的文件,但是当应用于大文件时,程序将无法输出。我需要一些帮助来修改脚本,以便它可以在所有文件上运行,即使它非常大。我的剧本:
#!/usr/bin/env perl
use strict;
use warnings;
no warnings qw( numeric );
my %seen;
$/ = "";
while (<>) {
chomp;
my ($key, $value) = split ('\t', $_);
my @lines = split /\n/, $key;
my $key1 = $lines[1];
$seen{$key1} //= [ $key ];
push (@{$seen{$key1}}, $value);
}
my $tot;
my $file_count = @ARGV;
while ( my ( $key1, $aref ) = each %seen ) {
$tot = 0;
for my $val ( @{ $aref } ) {
$tot += $val;
}
if ( @{ $aref } >= $file_count ) {
print join "\t", @{ $aref };
print "\tcount:". $tot."\n\n";
}
}
我正在提供样本文件,以便更好地了解情况。 data1.txt和data2.txt包含我的数据样本。如果每个读取的第二行匹配,那么我需要将所有文件中读取的次数相加,即输出两个文件应该如output.txt中所示:
**data1.txt**
@NS500278
AGATCNGAAGAGCACACGTCTGAACTCCAGTCACAACGTGATATCTCGTATGCCGTCTTC
+
=CCGGGCGGG1GGJJCGJJCJJJCJJGGGJJGJGJJJCG8JGJJJJ1JGG8=JGCJGG$G 1 :data1.txt
@NS500278
CATTGNACCAAATGTAATCAGCTTTTTTCGTCGTCATTTTTCTTCCTTTTGCGCTCAGGC
+
CCCGGGGGGGGGGJGJJJJJJJJJJJJJGJG$JJJJ$GGJ>JJJGGG8$CGJJGGCJ8JJ 3 :data1.txt
@NS500278
TACAGNGAGCAAACTGAAATGAAAAAGAAATTAATCAGCGGACTGTTTCTGATGTTATGG
+
CCCGGGGGGGGGGJGJJJJJJJJJJJJJGJG$JJJJ$GGJJJJJGGG8$CGJJGGCJ8JJ 2 :data1.txt
**data2.txt**
@NS500278
AGATCNGAAGAGCACACGTCTGAACTCCAGTCACAACGTGATATCTCGTATGCCGTCTTC
+
AAAAA#EEEEEEEEEEEEEEEE6EEEEEAEEEAE/AEEEEEEEAE<EEEEA</AE<EE 1 :data2.txt
@NS500278
CATTGNACCAAATGTAATCAGCTTTTTTCGTCGTCATTTTTCTTCCTTTTGCGCTCAGGC
+
AAAAA#E/<EEEEEEEEEEAEEEEEEEEA/EAAEEEEEEEEEEEE/EEEE/A6<E<EEE 2 :data2.txt
@NS500278
TACAGNGAGCAAACTGAAATGAAAAAGAAATTAATCAGCGGACTGTTTCTGATGTTATGG
+
AAAAA#EEEEEEEEAEEEEEEEEEEEEEEEEEEEEAEEEEEEEE/EEEAE6AE<EAEEAE 2 :data2.txt
**output.txt**
@NS500278
AGATCNGAAGAGCACACGTCTGAACTCCAGTCACAACGTGATATCTCGTATGCCGTCTTC
+
=CCGGGCGGG1GGJJCGJJCJJJCJJGGGJJGJGJJJCG8JGJJJJ1JGG8=JGCJGG$G 1 :data1.txt 1 :data2.txt count:2
@NS500278
CATTGNACCAAATGTAATCAGCTTTTTTCGTCGTCATTTTTCTTCCTTTTGCGCTCAGGC
+
CCCGGGGGGGGGGJGJJJJJJJJJJJJJGJG$JJJJ$GGJ>JJJGGG8$CGJJGGCJ8JJ 3 :data1.txt 2 :data2.txt count:5
@NS500278
TACAGNGAGCAAACTGAAATGAAAAAGAAATTAATCAGCGGACTGTTTCTGATGTTATGG
+
CCCGGGGGGGGGGJGJJJJJJJJJJJJJGJG$JJJJ$GGJJJJJGGG8$CGJJGGCJ8JJ 2 :data1.txt 2 :data2.txt count:4
我试图将我的哈希绑定到文件但无法理解该概念。如果有人能用一个简短的例子解释解决方案,那将是非常有帮助的。任何帮助将不胜感激。
答案 0 :(得分:0)
我认为规模问题更受关注,正如其他人在评论中所说的那样。将怪物哈希绑定到磁盘应该是解决问题的下一步。请参考perltie,如果您想要一个示例,this Perl Cookbook script应该有用。如果我的内存服务,Berkeley DB中的密钥和值都可以容纳4千兆字节,这应该足以满足您的需求。顺便说一句,这种方法的一个很好的副作用是你可以轻松地重复使用以前的结果。