perl在特定位置从文件中查找文本

perl在特定位置从文件中查找文本,perl,Perl,以上是日志文件的一部分。日志文件中的每一行的长度始终相同,并且具有与上面所示相同的模式。我需要读取文件并将所有行放置在一个数组中,其中每行中的位置42到46满足某些期望。在上述案例中,我们看到了以下数字: +006 -003 +003 +000 -001 有人能给我指出正确的方向吗 编辑: 谢谢阿蒙的建议 我最终得到了这段代码,以备将来参考 130723,-001,1.14,130725,+002,4.20,130731,+006,1.52,130728 130725,+002,4.20,130

以上是日志文件的一部分。日志文件中的每一行的长度始终相同,并且具有与上面所示相同的模式。我需要读取文件并将所有行放置在一个数组中,其中每行中的位置42到46满足某些期望。在上述案例中,我们看到了以下数字:

+006 -003 +003 +000 -001

有人能给我指出正确的方向吗

编辑:

谢谢阿蒙的建议

我最终得到了这段代码,以备将来参考

130723,-001,1.14,130725,+002,4.20,130731,+006,1.52,130728
130725,+002,4.20,130731,+006,1.52,130728,-003,0.00,130731
130731,+006,1.52,130728,-003,0.00,130731,+003,1.00,130731
130728,-003,0.00,130731,+003,1.00,130731,+000,0.00,130729
130731,+000,0.00,130729,-002,1.00,130728,-001,0.00,130728
打开(文件,$filename)或死亡“无法打开日志:$!”;
而{
如果((拆分/,/)[8]=“+003”){
推送@data,$\u}
关闭文件;
foreach(@data)
{
打印“$\r\n”;
}

我在想,如果这个文件真的变得很大,我应该采取什么步骤来快速优化流程?

虽然@amon的答案很优雅,但您可以使用:

打开文件,“filename.txt”或die$!;
而(){
如果$\=~/^.{41}(\+006)\(-003)\+003)\(\+000)\(-001)/
}

如果要按列编号执行,则可以谨慎使用
substr()

open FILE, "filename.txt" or die $!;
while (<FILE>) {
    if $_ =~ /^.{41}(\+006)|(-003)|(\+003)|(\+000)|(-001)/
}
您的问题要求第42列至第46列,但使用包含符号,选择5个位置,最后一个位置是逗号。指定42..46可能是列的基于1的半开范围

代码中的41是“第42-1列”(基于0的索引);第四个是‘46-42’。因此,对于[N..M]列,公式为:

perl -pe '$_ = substr($_, 41, 4) . "\n"' data
试一试


对于
split
→ <代码>while(){push@numbers,(split/,/)[7]}尝试自己编写一些东西,如果不起作用,请将它带给我们以帮助您。您开始编写,我们帮助。我们不为您编写。向我们展示您尝试过的实际代码,然后我们可以从中帮助您。如果您先自己尝试,您可能会非常接近答案。您为什么要为o打开文件verwrite然后尝试从中读取?如果OP尝试此代码,他有丢失输入文件的风险。让我们希望他进行了备份。此外,您的If语句无法编译。
perl -pe '$_ = substr($_, 41, 4) . "\n"' data
perl -pe '$_ = substr($_, N-1, M-N) . "\n"' data
perl -F, -ane '$F[7] eq "+003" and push @l,$_; END { print for @l }'<<XXX
130723,-001,1.14,130725,+002,4.20,130731,+006,1.52,130728
130725,+002,4.20,130731,+006,1.52,130728,-003,0.00,130731
130731,+006,1.52,130728,-003,0.00,130731,+003,1.00,130731
130728,-003,0.00,130731,+003,1.00,130731,+000,0.00,130729
130731,+000,0.00,130729,-002,1.00,130728,-001,0.00,130728
XXX
130731,+006,1.52,130728,-003,0.00,130731,+003,1.00,130731