in reply to Count the Duplicate Entries and make them uniq

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

Replies are listed 'Best First'.
Re^2: Count the Duplicate Entries and make them uniq
by slayedbylucifer (Scribe) on Aug 29, 2012 at 15:20 UTC
    Thanks for your time. I am working on it. I will update this thread with my result.
Re^2: Count the Duplicate Entries and make them uniq
by slayedbylucifer (Scribe) on Aug 30, 2012 at 04:20 UTC
    Hello philiprbrenan, Your solution is working perfectly the way I wanted. thank you very-much for your time and response. I had to tweak your script a little bit in order to make is work with my actual CSV but the whole logic that you have used remains the same. Thanks you very much.