a/list.txt a/list.txt a/list.txt b/list.txt a/list.txt c/list.txt a/list.txt d/list.txt a/list.txt e/list.txt a/list.txt f/list.txt a/list.txt g/list.txt a/list.txt h/list.txt a/list.txt i/list.txt a/list.txt j/list.txt #### ######## CODE.PL ############# #!/usr/bin/perl use strict; use warnings; use List::Util qw/ max /; open my $fh, "<", 'SUPERLIST_PRODUCT.txt' or die $!; my $spr_prod = do {local $/; <$fh>}; close $fh or die $!; my @spr_prod = $spr_prod =~ /\d+/g; open $fh, "<", 'SUPERLIST_SUBSTRATE.txt' or die $!; my $spr_substr = do {local $/; <$fh>}; close $fh or die $!; my @spr_substrate = $spr_substr =~ /\d+/g; my @matrix; my $path = '.'; # (current directory - '.') or path to data files my @file = qw/list.txt another.txt/; for my $file ( @file ) { my %data; my @substrate; open my $fh, "<", "$path/$file" or die "Unable to open $file for reading. $!"; while (<$fh>) { if (/^substrate/) { @substrate = /\d+/g; } elsif (/^product/) { while (/(\d+)/g) { for my $sub (@substrate) { $data{$sub}{$1} = 1 ; } } } else { die "Unknown format $file. $!"; } } close $fh or die "Unable to close $file. $!"; print "Processing file: $file\n"; process(\@spr_prod, \@spr_substrate, %data); push @matrix, \%data; } for my $i (0 .. $#matrix) { for my $j ($i+1 .. $#matrix) { print "Combining $file[$i] and $file[$j]\n"; my %data = combine($matrix[$i], $matrix[$j]); process(\@spr_prod, \@spr_substrate, %data); } } sub process { my ($spr_prod, $spr_subst, %data) = @_; my %seen; my @product = sort {$a <=> $b} grep ! $seen{$_}++, @$spr_prod, map keys %$_, values %data; # to get column width for print my $wid = 1 + max map length, @product; printf "%7s" . "%${wid}s" x @product . "\n", 'prod->', @product; undef %seen; my @substrate = sort {$a <=> $b} grep ! $seen{$_}++, @$spr_subst, keys %data; for my $substrate (@substrate) { printf "%7s", $substrate; printf "%${wid}s", $data{$substrate}{$_} || '-' for @product; print "\n"; } printf "\n%5s\n%5s\n%s\n\n", '^', '|', 'substrate'; } sub combine { my ($matrix1, $matrix2) = @_; my %new_hash = %$matrix1; for my $substrate (keys %$matrix2) { $new_hash{$substrate}{$_} = 1 for keys %{ $matrix2->{$substrate} }; } return %new_hash; } #### ##########INPUT############### list.txt substrate: 1 2 product: 3 substrate: 6 9 product: 8 10 substrate: 3 product: 6 substrate: 9 product: 5 substrate: 5 product: 2 substrate: 3 product: 9 substrate: 8 product: 9 substrate: 8 product: 1 substrate: 7 product: 11 substrate: 19 product: 17 substrate: 14 product: 13 substrate: 14 product: 11 substrate: 18 product: 19 substrate: 7 14 product: 15 substrate: 7 16 product: 7 17 substrate: 5 product: 6 substrate: 18 15 product: 7 substrate: 7 8 product: 8 18 substrate: 6 product: 9 substrate: 11 product: 12 another.txt substrate[s]: 3649 product[s]: 3419 3648 substrate[s]: 3645 product[s]: 3647 substrate[s]: 3659 product[s]: 3647 substrate[s]: 3675 product[s]: 3674 substrate[s]: 3674 product[s]: 3490 3489 substrate[s]: 3489 product[s]: 3490 substrate[s]: 3490 product[s]: 3485 substrate[s]: 3485 product[s]: 3486 substrate[s]: 3486 product[s]: 3488 substrate[s]: 3488 product[s]: 3487 substrate[s]: 3487 product[s]: 3877 substrate[s]: 3877 product[s]: 3419 substrate[s]: 3182 product[s]: 1875 substrate[s]: 2809 product[s]: 3182 substrate[s]: 3186 product[s]: 2809 #### ############OUTPUT################# Processing file: list.txt prod-> 1 2 3 5 6 7 8 9 10 11 12 13 15 17 18 19 1 - - 1 - - - - - - - - - - - - - 2 - - 1 - - - - - - - - - - - - - 3 - - - - 1 - - 1 - - - - - - - - 5 - 1 - - 1 - - - - - - - - - - - 6 - - - - - - 1 1 1 - - - - - - - 7 - - - - - 1 1 - - 1 - - 1 1 1 - 8 1 - - - - - 1 1 - - - - - - 1 - 9 - - - 1 - - 1 - 1 - - - - - - - 11 - - - - - - - - - - 1 - - - - - 14 - - - - - - - - - 1 - 1 1 - - - 15 - - - - - 1 - - - - - - - - - - 16 - - - - - 1 - - - - - - - 1 - - 18 - - - - - 1 - - - - - - - - - 1 19 - - - - - - - - - - - - - 1 - - ^ | substrate Processing file: another.txt prod-> 1875 2809 3182 3419 3485 3486 3487 3488 3489 3490 3647 3648 3674 3877 2809 - - 1 - - - - - - - - - - - 3182 1 - - - - - - - - - - - - - 3186 - 1 - - - - - - - - - - - - 3485 - - - - - 1 - - - - - - - - 3486 - - - - - - - 1 - - - - - - 3487 - - - - - - - - - - - - - 1 3488 - - - - - - 1 - - - - - - - 3489 - - - - - - - - - 1 - - - - 3490 - - - - 1 - - - - - - - - - 3645 - - - - - - - - - - 1 - - - 3649 - - - 1 - - - - - - - 1 - - 3659 - - - - - - - - - - 1 - - - 3674 - - - - - - - - 1 1 - - - - 3675 - - - - - - - - - - - - 1 - 3877 - - - 1 - - - - - - - - - - ^ | substrate Combining list.txt and another.txt prod-> 1 2 3 5 6 7 8 9 10 11 12 13 15 17 18 19 1875 2809 3182 3419 3485 3486 3487 3488 3489 3490 3647 3648 3674 3877 1 - - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - 2 - - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - 3 - - - - 1 - - 1 - - - - - - - - - - - - - - - - - - - - - - 5 - 1 - - 1 - - - - - - - - - - - - - - - - - - - - - - - - - 6 - - - - - - 1 1 1 - - - - - - - - - - - - - - - - - - - - - 7 - - - - - 1 1 - - 1 - - 1 1 1 - - - - - - - - - - - - - - - 8 1 - - - - - 1 1 - - - - - - 1 - - - - - - - - - - - - - - - 9 - - - 1 - - 1 - 1 - - - - - - - - - - - - - - - - - - - - - 11 - - - - - - - - - - 1 - - - - - - - - - - - - - - - - - - - 14 - - - - - - - - - 1 - 1 1 - - - - - - - - - - - - - - - - - 15 - - - - - 1 - - - - - - - - - - - - - - - - - - - - - - - - 16 - - - - - 1 - - - - - - - 1 - - - - - - - - - - - - - - - - 18 - - - - - 1 - - - - - - - - - 1 - - - - - - - - - - - - - - 19 - - - - - - - - - - - - - 1 - - - - - - - - - - - - - - - - 2809 - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - 3182 - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - - - 3186 - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - - 3485 - - - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - 3486 - - - - - - - - - - - - - - - - - - - - - - - 1 - - - - - - 3487 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 3488 - - - - - - - - - - - - - - - - - - - - - - 1 - - - - - - - 3489 - - - - - - - - - - - - - - - - - - - - - - - - - 1 - - - - 3490 - - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - 3645 - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - - - 3649 - - - - - - - - - - - - - - - - - - - 1 - - - - - - - 1 - - 3659 - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - - - 3674 - - - - - - - - - - - - - - - - - - - - - - - - 1 1 - - - - 3675 - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - 3877 - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - ^ | substrate