Perl соответствует значению, затем соответствует количеству значений каждого значения - PullRequest
0 голосов
/ 11 июня 2019

Итак, у меня есть некоторые данные в форме с разделителями табуляции:

Windows Department1 Enterprise
Windows Department1 Home
Linux   Department2 Santiago
Windows Department1 Professional
Windows Department1 Enterprise
Windows Department2 Enterprise

В этом случае мне нужно сначала сопоставить первый столбец и получить количество каждого значения во 2-м и 3-м столбцах. Сортировать по количеству точных совпадений. Итак, в итоге что-то вроде:

Windows Department1 Enterprise = 2
Windows Department2 Professional = 1
Linux   Department2 Santiago = 1
Windows Department3 Home = 1
Windows Department2 Enterprise = 1

Итак, я перепробовал множество вещей, причем это была последняя попытка, и я получил много разных нежелательных результатов:

use strict;
use warnings;
my %seen;
my $count = 0;
while (<INPUTFILE>) {
my ($app,$dep,$name) = split(/\t/,$_);
   if ($app.$dep.$name eq 'Windows.Department1.Professional') {
   unless ($seen{$app.$dep.name}++) {
     $count++;
      }
   }
}
print $app . " " . $dep . " " . $name . " " . $count++

Но это не делает удаленно то, что я хочу. и просто печатает последние значения со счетчиком. Я хочу один раз установить $app, а затем сопоставить второе и третье значения, чтобы получить счет. Кроме этого, мне нужно вручную сопоставить каждый элемент с eq, и в приведенном выше примере удаленно не показано количество данных в файле, так что это станет проблемой. Буду очень признателен за любую помощь.

1 Ответ

1 голос
/ 11 июня 2019

Сначала создайте хеш с ключом, который вы хотите считать уникальным: комбинация $ app, $ dep и $ name. Вы можете использовать комбинированный ключ для этого, но давайте использовать многомерный хеш, чтобы ключи оставались отдельными для дальнейшего использования. Каждый промежуточный уровень автоматически будет автоматически оживляться , когда мы увеличиваем счет.

use strict;
use warnings;
open my $input, '<', $filename or die "open $filename failed: $!";
my %counts;
while (my $line = <$input>) {
  chomp $line; # otherwise trailing field will contain a newline
  my ($app, $dep, $name) = split /\t/, $line;
  $counts{$app}{$dep}{$name}++;
}

Затем выполните итерации по хешу, чтобы распечатать каждый счет.

foreach my $app (sort keys %counts) {
  my $app_counts = $counts{$app};
  foreach my $dep (sort keys %$app_counts) {
    my $dep_counts = $app_counts->{$dep};
    foreach my $name (sort keys %$dep_counts) {
      my $count = $dep_counts->{$name};
      print "$app $dep $name $count\n";
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...