使用Perl计算文本文件中的唯一项目

时间:2014-05-22 23:15:03

标签: perl unique

我有一个文本文件,其中列出了数千个名字姓。有关如何使用Perl仅计算唯一姓氏的任何示例?

我已经使用$ count ++进行标准计数以获得总计,但我仍然需要知道一个独特的计数。

感谢您的任何建议!

6 个答案:

答案 0 :(得分:1)

标准方法是使用散列(关联数组),其键是要计算的字符串。由于哈希最多只包含一次给定的密钥,因此可以计算不同的字符串。例如:

my @input_list = ('a', 'b', 'a', 'b', 'a');
my %result_hash;
foreach my $val (@input_list) {
    ++$result_hash{$val};
}
# %result_hash is now (a => 3, b => 2)
print scalar keys %result_hash; # prints '2' (the number of keys)

答案 1 :(得分:1)

因为哈希的键总是唯一的,所以我建议你可以创建一个元素,它在集合中应该是唯一的,哈希的键。 在您的情况下,使用具有姓氏作为键的哈希来删除重复的哈希并计算具有每个姓氏的人数。

$nameList=['Eric|Johnson',
            'Herbert|Schildt',
            'Carl|Schildt',
            'Rose|Johnson',
            'Allen|Johnson',];
$nameHash={};
map {$_=~/\|(\w+)/; $nameHash->{$1}+=1;} @{$nameList};
# read the string behind "|"
# subsequently, make this string the key of hash
# increase the value of this key to count the number of people having this last name
map {print "$_: $nameHash->{$_} people\n"} keys %{$nameHash};

然后,你可以得到像

这样的结果
Johnson: 3 people
Schildt: 2 people

总而言之,只要你想要一套就回忆哈希。干杯!

答案 2 :(得分:1)

另一种方法,希望更具可读性:

#!/usr/bin/perl
use strict;
use warnings;

my %names = ();
while (  my $name = <DATA>)
{
     chomp($name);
     my ($fname, $lname) = split(/\|/, $name);
     if (exists($names{$lname}))
     {
       $names{$lname} += 1;
     }
     else
     {
       $names{$lname} = 1;
     }

}

foreach my $name (sort { $names{$b} <=> $names{$a} } keys %names) {
  printf "%s: %s\n", $name, $names{$name};
}

print "Unique Names: " . scalar keys(%names) . "\n";

__DATA__
Rosetta|Drayer
Celinda|Blaylock
Twana|Riner
Mike|Riner
Bob|Riner
Linda|Riner
Liliana|Littlejohn
John|Littlejohn
Candance|Candanoza
Brian|Candanoza
George|Candanoza
Noreen|Frandsen
Nakisha|Feltmann
Vanetta|Feltmann
Lorretta|Feltmann
Domenic|Feltmann
Madalene|Feltmann
Rosalinda|Feltmann
Brandie|Feltmann
Nu|Feltmann
Tennille|Feltmann

输出 - 按数字降序排序

Feltmann: 9
Riner: 4
Candanoza: 3
Littlejohn: 2
Frandsen: 1
Drayer: 1
Blaylock: 1

Unique Names: 7

答案 3 :(得分:1)

这是使用uniq函数的另一种方式:

#!/usr/bin/perl
use strict;
use warnings;

use List::MoreUtils 'uniq';


my @names = ();
while (  my $name = <DATA>)
{
     chomp($name);
     my ($fname, $lname) = split(/\|/, $name);
     push(@names, $lname);
}

my @uniq = uniq @names;
print "Unique Names: " . scalar @uniq . "\n";

__DATA__
Rosetta|Drayer
Celinda|Blaylock
Twana|Riner
Mike|Riner
Bob|Riner
Linda|Riner
Liliana|Littlejohn
John|Littlejohn
Candance|Candanoza
Brian|Candanoza
George|Candanoza
Noreen|Frandsen
Nakisha|Feltmann
Vanetta|Feltmann
Lorretta|Feltmann
Domenic|Feltmann
Madalene|Feltmann
Rosalinda|Feltmann
Brandie|Feltmann
Nu|Feltmann
Tennille|Feltmann

<强>输出

Unique Names: 7

答案 4 :(得分:0)

只需使用哈希来跟踪值,然后在最后计算:

perl -lne '
     my ($ln) = (split /\s*\|\s*/)[1];
     $h{$ln}++;
     END { print scalar keys %h }
  ' file.txt

答案 5 :(得分:0)

你想要的是一本字典。您可以逐个阅读这些行(可能是在while循环中),删除换行符,按管道符分割,这样就有一个变量,比如说$lastname,它有你想要的字段。

然后,您执行以下操作:$count{$lastname}++

请注意,$count{$lastname}$count完全无关;它是一个单独的变量。

完成循环后,您可以浏览每个姓氏:foreach $lastname (keys(%count)) {...并打印$lastname$count{$lastname}