Build a data structure from the relational layout you have provided aggregating the Yes and No entries and then walk the resulting structure to print the desired results. For safety you could add some data validation.
use feature ":5.14"; use warnings FATAL => qw(all); use strict; use Data::Dump qw(dump pp); my @l = split /\n/, << 'END'; Ubuntu,Warty,No Ubuntu,Hoary,No Ubuntu,Breezy,Yes Ubuntu,Breazy,Yes Fedora,Yarrow,Yes Fedora,Stentz,No Fedora,Yarrow,Yes Fedora,Yarrow,Yes Windows,XP PRO,Yes Windows,XP PRO,Yes Windows,XP Home,No Windows,XP PRO,Yes END my $h; for(@l) {my @w = split /,/; $h->{$w[0]}{$w[1]}{$w[2]}++; } pp($h); for my $o(sort keys %$h) {for my $r(sort keys %{$h->{$o}}) {my %yn = %{$h->{$o}{$r}}; my ($yes, $no) = ($yn{Yes}//0, $yn{No}//0); say "$o\t$r\t$yes\t$no"; } }
Produces
{
Fedora => { Stentz => { No => 1 }, Yarrow => { Yes => 3 } },
Ubuntu => {
Breazy => { Yes => 1 },
Breezy => { Yes => 1 },
Hoary => { No => 1 },
Warty => { No => 1 },
},
Windows => { "XP Home" => { No => 1 }, "XP PRO" => { Yes => 3 } },
}
Fedora Stentz 0 1
Fedora Yarrow 3 0
Ubuntu Breazy 1 0
Ubuntu Breezy 1 0
Ubuntu Hoary 0 1
Ubuntu Warty 0 1
Windows XP Home 0 1
Windows XP PRO 3 0
In reply to Re: Count the Duplicate Entries and make them uniq
by philiprbrenan
in thread Count the Duplicate Entries and make them uniq
by slayedbylucifer
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |