#! perl use strict; use warnings; use List::Util qw( any ); my (%gene2TF2val, %TF); while () { my ($gene, $tf) = split; push @{ $gene2TF2val{ $gene } }, $tf; ++$TF{ $tf }; } # Print table header print "\t$_" for sort tf_sort keys %TF; print "\n"; # Print table contents for my $gene (sort keys %gene2TF2val) { # Print one line print $gene; for my $tf (sort tf_sort keys %TF) { print "\t", (any { $_ eq $tf } @{ $gene2TF2val{$gene} }) ? '+' : '-'; } print "\n"; } sub tf_sort { my ($pre_a, $num_a) = $a =~ /^(\D+)(\d+)/; my ($pre_b, $num_b) = $b =~ /^(\D+)(\d+)/; return $pre_a cmp $pre_b || $num_a <=> $num_b; } __DATA__ geneA T1 geneA T1 geneA T2 geneB T8 geneC T10 geneC T1