【发布时间】:2017-11-26 23:31:30
【问题描述】:
我是 perl 新手,我正在尝试像使用 awk 一样从文件中提取数据。我已经从文件中收集了数据并将其存储在数组“array”中。我想抓住唯一的某些列和某些行。例如,我只想选择索引 7 (Q) 并选择三个数字,最终制作一个子程序来平均它们。我还希望能够从 D 中获取日期的单个字段。使用 awk 和 cut 有很简单的方法可以做到这一点,但我很难弄清楚如何用 Perl 做到这一点。
Here is the data.txt file
F gge0001x gge0001y gge0001z
D 12-30-2006 12-30-2006 12-30-2006
T 14:15:20 14:15:55 14:16:27
S a69 a69 a69
B 15.8 16.1 15
M gge06001 gge06001 gge06001
P 30.1 29.6 29.9
Q 20.2 22.3 23.4
我可以把它放到我可以选择我想要的索引的地方,我只是不能剪切字段
Performance Data
Q 20.2 22.4. 23.4
到目前为止,这是我的代码......
use constant;
use strict;
use warnings;
use diagnostics;
my $my_file = 'data.txt';
my @array;
open my $fh, '<', 'data.txt'
or die "Cant open : ";
printf ("%10s", "Performance Data\n");
while(<$fh>)
{
if( /\bF|T|B|P|Q|R|H|O|C|K|W|L\b/)
{
push @array, $_;
}
}
my @tab = split(/\s+/, $array[2]);
print $tab[-2], [-3], "\n";
感谢您的帮助
【问题讨论】:
-
我有点不清楚。您只想从以
Q开头的行中选择20.2、22.4、23.4?那正确吗?还是您也想选择其他行/值? /// 你的所有行都包含 4 个空格分隔的列吗? -
@PerlDuck 是的,所有行都包含 4 个空格分隔的列。我确实希望从 Q 行中选择 20.2、20.4 和 23.4。我也想选择其他行。例如第 F 行,我只想要第二个字段(gge0001x)。还有其他行具有不同的标准,但是一旦我弄清楚如何在一个示例中执行此操作,我应该能够在整个过程中实现它
-
一个建议:在学习新工具时,尽量不要模仿你知道的其他工具。虽然这对您有所帮助,但您越早使用新工具及其原生方式和习语越好。例如,这里不需要引用
awk和cut。 -
/\bF|T|B|P|Q|R|H|O|C|K|W|L\b/匹配\bF或T或B或 ... 或L\b。您的意思可能是/\b(?:F|T|B|P|Q|R|H|O|C|K|W|L)\b/或/^(?:F|T|B|P|Q|R|H|O|C|K|W|L)/(也可以写成/\b[FTBPQRHOCKWL]\b/或/^[FTBPQRHOCKWL]/)
标签: perl