首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl从文件列中获取唯一值

Perl从文件列中获取唯一值
EN

Stack Overflow用户
提问于 2014-05-27 23:17:42
回答 2查看 2.9K关注 0票数 1

我有一个文件,它有以下数据:

代码语言:javascript
复制
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列打印唯一的值。

目前,我的产出是:

代码语言:javascript
复制
ext3 
ext3 
ext3 
nfs 
ext4 
iso9660

我的产出应该是:

代码语言:javascript
复制
ext3
nfs
ext4
iso9660

以下是我迄今所做的尝试:

代码语言:javascript
复制
#!/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;

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-27 23:20:00

使用perl oneliner

代码语言:javascript
复制
perl -lane 'print $F[2] if ! $seen{$F[2]}++' file.txt

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

代码语言:javascript
复制
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;
票数 0
EN

Stack Overflow用户

发布于 2014-05-27 23:21:47

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

此外,在命令行上命名的文件不需要显式打开。您可以使用<>从它们中读取,如下所示

代码语言:javascript
复制
use strict;
use warnings; 

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

输出

代码语言:javascript
复制
ext3
nfs
ext4
iso9660
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23900461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档