2010-08-26 31 views
0

我有一些数据从UNIX命令行调用如何在Perl中提取特定数据列?

1 ab 45 1234 
2 abc 5 
4 yy 999 2 
3 987 11 

我会用system()函数调用。

如何在Perl中将第二列数据提取到数组中?此外,数组大小必须取决于我拥有的行数(它不一定是4)。我想让这个数组有("ab", "abc", "yy", 987)

回答

8
use strict; 
use warnings; 

my $data = "1 ab 45 1234 
2 abc 5 
2 abc 5 
2 abc 5 
4 yy 999 2 
3 987 11"; 

my @second_col = map { (split)[1] } split /\n/, $data; 

要获得唯一值,请参见perlfaq4。下面是提供有部分的答案:到UNIX脚本:

my %seen; 
my @unique = grep { ! $seen{ $_ }++ } @second_col; 
+0

@FM:什么'my'吗? – Lazer 2010-08-26 09:22:38

+2

@Lazer它在当前词法范围内声明变量。你提出的这个问题表明你没有在你的Perl脚本中启用'use strict'和可能的'use warnings'。如果没有,你应该开始这样做。 – FMc 2010-08-26 09:26:20

+0

@FM:谢谢!虽然这解决了我眼前的问题,是否有一种简单的方法可以在'second_col'中获得唯一的结果? – Lazer 2010-08-26 09:29:00

4

你可以连续使用一个Perl CMD线电话(one-liner又名):

perl -lane 'print $F[1]' data.dat 

代替data.dat文件,使用管道从您的命令行工具

cat data.dat | perl -lane 'print $F[1]' 

附录

扩展为结果列的唯一岬很简单:

cat data.dat | perl -lane 'print $F[1] unless $seen{$F[1]}++' 

,或者,如果你很懒(雇用%_):

cat data.dat | perl -lane 'print unless $_{$_=$F[1]}++' 
+0

+1提醒我关于'-a'选项。 – FMc 2010-08-26 09:41:34

+0

好的答案,一定很好,明确指出'-a'选项autosplits为'@ F'。不知道'-l'做了什么,但... – 2010-08-26 10:42:19

+0

@PP,-l做适当的*新行*处理,请参阅:http://sial.org/howto/perl/one-liner/,好吧,我加了一个解释的链接(谢谢) – 2010-08-26 10:48:23