#!/usr/bin/env perl use strict; use warnings; my %tmp; while () { chomp; my ($k0, $k, $v) = (split /\t/)[0, 2, 5]; $tmp{$k0}{k} = exists $tmp{$k0}{k} ? join ',' => $tmp{$k0}{k}, $k : $k; $tmp{$k0}{v} = exists $tmp{$k0}{v} ? join ',' => $tmp{$k0}{v}, $v : $v; } my %out = map { $_ => { $tmp{$_}{k} => $tmp{$_}{v} } } keys %tmp; # For testing use Data::Dumper; print Dumper \%out; __DATA__ p1 X cis X X 10 p1 X plat X X 20 p1 X gls X X NA p2 X cis X X 0 p2 X NA X X 9 #### $VAR1 = { 'p1' => { 'cis,plat,gls' => '10,20,NA' }, 'p2' => { 'cis,NA' => '0,9' } };