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->{$substrat
+e} };
}
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 36
+74 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 3
+647 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
</code> |