我有一个文件,我必须按块(基于时间戳)读取块。所以我使用awk在两个时间间隔之间读取,然后我必须进一步处理数据。为此,我必须阅读我从awk Line By Line收到的字符串。当我使用新字符执行拆分时,它不会拆分,但只有所有字符串都保留在第一个字段中。我使用了不同的转义字符但没有任何成功。
我的主要目标是逐行读取字符串。
$cmd = "awk '\$0>=from&&\$0<=to' from=\"$currentTime\" to=\"$nextTime\" Output.txt";
$dataChunk = system ($cmd);
my @lines = split /[\r\s\v\V\n]+/, $dataChunk;
foreach my $line (@lines) {
chomp;
$timeStamp1 = (split /-/, $line)[1];
print "\n$timeStamp1\n";
exit;
}
答案 0 :(得分:6)
应该是,
my $dataChunk = qx($cmd);
my @lines = split /[\r\s\v\V\n]+/, $dataChunk;
因为system()
返回值是程序的退出状态。
答案 1 :(得分:4)
问题在于system
没有按照您的想法行事。 system
将返回退出代码,而不是命令的标准输出。
对于命令的标准输出,您希望使用qx($cmd)
(或使用命令周围的反引号)。
答案 2 :(得分:2)
当您只想在两个时间戳之间读取时,使用awk
愚蠢:
use strict;
use warnings;
use autodie;
use feature qw(say);
use constant TIMESTAMP_FILE => 'Output.txt';
my $current_time = ...;
my $next_time = ...;
open my $tstamp_fh, "<", TIMESTAMP_FILE;
while ( my $line = <$tstamp_fh> ) {
chomp $line; # Always chomp on a read!
next if $line lt $current_time or $line gt $next_time;
say (split /-/, $line)[1]; # Is this the first or second element of the array?
}
这样的事情。这有点难以辨别,因为我不知道你的文件是什么样的。
主要的是,当您使用Perl时,绝对不需要运行awk
。无论Awk能做什么,Perl都可以。
如果你不是百分百确定如何做某事,你可以随时使用Perl附带的a2p
程序将任何Awk程序翻译成Perl代码。