0
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

以上是日志文件的一部分。日志文件中的每一行始终具有相同的长度,并且具有与您在上面看到的相同的模式。我需要读取文件并将每行中位置 42 到 46 的所有行都放在一个数组中。在上面的案例中,我们正在查看以下数字:

+006 -003 +003 +000 -001

有人可以指出我正确的方向吗?

编辑 :

感谢 Amon 的建议。

我最终得到了这个代码以供将来参考。

open (FILE, $filename) or die "Couldn't open log: $!";
while (<FILE>) { 
if ((split /,/)[8] == "+003"){
push @data, $_ }}

close FILE;

foreach(@data)
{
    print "$_\r\n";
}

如果这个文件变得非常大,我在考虑未来我应该采取哪些步骤来快速优化流程?

4

3 回答 3

1

如果你想通过列号来做,那么substr()可以小心使用:

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

您的问题要求列 42..46,但使用包含符号,选择 5 个位置,最后一个是逗号。指定 42..46 可能是基于 1 的半开范围的列。

代码中的 41 是 'column 42 - 1' (从 0 开始的索引);4 是“46 - 42”。因此,对于列 [N..M),公式为:

perl -pe '$_ = substr($_, N-1, M-N) . "\n"' data
于 2013-05-07T21:19:58.003 回答
0

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

open FILE, "filename.txt" or die $!;
while (<FILE>) {
    if $_ =~ /^.{41}(\+006)|(-003)|(\+003)|(\+000)|(-001)/
}
于 2013-05-07T21:01:35.413 回答
0

尝试

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
于 2013-05-07T22:15:24.670 回答