Perl从文件列获取唯一值

时间:2014-05-27 23:17:43

标签: arrays perl file unique

我有一个包含以下数据的文件:

col1 col2 ext3 rw
col1 col2 ext3 rw 
col1 col2 ext3 rw 
col1 col2 nfs rw 
col1 col2 ext4 rw 
col1 col2 iso9660 ro

我要做的是读取文件并从第3列打印唯一值。第3列包含ext3,ext4,nfs ......

目前我的输出是:

ext3 
ext3 
ext3 
nfs 
ext4 
iso9660

我的输出应该是:

ext3
nfs
ext4
iso9660

以下是我迄今为止所尝试的内容:

#!/usr/bin/perl    
use strict;
use warnings; 
my $filename = $ARGV[0];
open(FILE, $filename) or die "Could not open file '$filename' $!";
while (<FILE>)
{
    chomp;
    my $line = $_;
    my @elements = split (" ", $line);
    my $row_name = $elements[2];
    print $row_name . "\n";

}
close FILE;

如何让它在同一程序中打印唯一值? 谢谢。

2 个答案:

答案 0 :(得分:3)

您可以使用哈希来跟踪之前看过的值。

此外,不需要显式打开在命令行上命名的文件。你可以使用<>来阅读它们,就像这样

use strict;
use warnings; 

my %seen;
while (<>) {
  my $col3 = (split)[2];
  print "$col3\n" unless $seen{$col3}++;
}

<强>输出

ext3
nfs
ext4
iso9660

答案 1 :(得分:0)

使用perl oneliner

perl -lane 'print $F[2] if ! $seen{$F[2]}++' file.txt

或者在您的脚本中,通过添加perlfaq4 How can I remove duplicate elements from a list or array?

中演示的%seen哈希
use strict;
use warnings; 
my $filename = $ARGV[0];
open(FILE, $filename) or die "Could not open file '$filename' $!";
my %seen;
while (<FILE>)
{
    chomp;
    my $line = $_;
    my @elements = split (" ", $line);
    my $row_name = $elements[2];
    print $row_name . "\n" if ! $seen{$row_name}++;
}
close FILE;