【问题标题】:Perl getting unique values from file column [duplicate]Perl从文件列中获取唯一值[重复]
【发布时间】:2014-05-28 07:21:47
【问题描述】:

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

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;

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

【问题讨论】:

    标签: arrays perl file unique


    【解决方案1】:

    您可以使用散列来跟踪以前见过的值。

    另外,在命令行命名的文件不需要显式打开。您可以使用&lt;&gt; 阅读它们,就像这样

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

    输出

    ext3
    nfs
    ext4
    iso9660
    

    【讨论】:

      【解决方案2】:

      使用 perl 单行器

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

      或者在您的脚本中,通过添加 %seen 哈希,如 perlfaq4 How can I remove duplicate elements from a list or array? 中所示

      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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-14
        • 2013-06-12
        • 2012-10-05
        • 1970-01-01
        • 2011-06-19
        • 2010-11-26
        • 2018-03-03
        • 2023-03-21
        相关资源
        最近更新 更多