我正在打开一个包含单个但非常长的列的文件。我想从它中检索一个短段,从指定的行开始,到另一个指定的行结束。目前,我的脚本逐行读取文件,直到找到所需的行。我正在使用:
my ( $from, $to ) = ( some line number, some larger line number );
my $count = 1;
my @seq = ();
while ( <SEQUENCE> ) {
print "$_ for $count\n";
$count++;
while ( $count >= $from && $count <= $to ) {
push( @seq, $_ );
last;
}
}
print "seq is: @seq\n";
输入看起来像:
A
G
T
C
A
G
T
C
.
.
.
我怎么能“跳”到我想去的地方?
答案 0 :(得分:2)
您需要使用搜索移动到文件的正确部分。参考:http://perldoc.perl.org/functions/seek.html
这适用于字节,而不是行,所以通常如果你需要使用行寻求它不是一个选项。但是,由于您正在使用固定长度的行(2或3个字节,具体取决于您平台的EOL编码),您可以将行长乘以您想要的行(0索引),并且您将位于正确的读取位置
答案 1 :(得分:2)
如果您碰巧知道所有行的长度完全相同(占行结束字符,一般在Unix / Linux上为1个字节,在Windows上为2个),您可以使用seek
直接转到文件中的指定点
seek
函数允许您以字节/字符指定文件位置,而不是行。在一般情况下,转到指定行号的唯一方法是从头开始读取并跳过那么多行(减去一行)。
除非你有一个索引映射行号到字节偏移量;然后,您可以在索引中查找指定的行号,并使用seek
跳转到该位置。为此,您必须单独构建索引(需要读取整个文件的过程)并确保索引始终是最新的。如果文件经常更改,这可能是不切实际的。
我不知道有任何用于构建和使用此类索引的现有工具,但如果它们存在,我不会感到惊讶。但它应该很容易推出自己的。
但除非扫描文件以找到您想要的行号是一个重要的性能瓶颈,否则我不会为额外的复杂性而烦恼。