#!/usr/bin/env perl -l use strict; use warnings; use autodie; use Text::CSV; my $csv = Text::CSV::->new({sep_char => "\t"}); my %data; while (my $row = $csv->getline(\*DATA)) { ++$data{$row->[0]}{count}; ++$data{$row->[0]}{values}{$row->[1]}{count}; push @{$data{$row->[0]}{values}{$row->[1]}{values}}, $row->[2]; } use Data::Dump; dd \%data; __DATA__ A B n1 A B n2 A C n1 D E n2 D E n4 D F n1