#!/usr/bin/perl use say; use strict; use warnings; use Data::Dumper; my @keys_input_file = ('scenario', 'pins', 'threshold-1', 'threshold-2', 'subtraction', 'notation'); my @keys_filter_file = ('pins', 'threshold-1', 'threshold-2', 'justification', 'date'); my %HoH_Input; my %HoH_Filter; # reset line numbering on each input file while (<>) { chomp; next if /^\s*$/; # skip empty lines my @values; if (/,/) { @values = split /,/, $_; @{$HoH_Filter{$ARGV}{$.}}{@keys_filter_file} = @values; } else { @values = split /\s+/, $_; @{$HoH_Input{$ARGV}{$.}}{@keys_input_file} = @values; } } continue { close ARGV if eof; # Not eof()! } # print Dumper \%HoH_Input, \%HoH_Filter; my $result = 'output.txt'; open my $output, '>>', $result or die "Could not open ".$result.": $!"; foreach my $file ( sort { keys %{ $HoH_Input{$b} } <=> keys %{ $HoH_Input{$a} } } keys %HoH_Input ) { foreach my $line ( sort { $HoH_Input{$file}{$a} <=> $HoH_Input{$file}{$b} } keys %{ $HoH_Input{$file} } ) { foreach my $filter ( sort { keys %{ $HoH_Filter{$b} } <=> keys %{ $HoH_Filter{$a} } } keys %HoH_Filter ) { foreach my $filter_line ( sort { $HoH_Filter{$filter}{$a} <=> $HoH_Filter{$filter}{$b} } keys %{ $HoH_Filter{$filter} } ) { if ( $HoH_Input{$file}{$line}{'pins'} eq $HoH_Filter{$filter}{$filter_line}{'pins'} ) { my $subtraction = sprintf('%2.2f', $HoH_Filter{$filter}{$filter_line}{'threshold-1'} - $HoH_Filter{$filter}{$filter_line}{'threshold-2'}); say $output join (' ', $HoH_Input{$file}{$line}{'scenario'}, $HoH_Input{$file}{$line}{'pins'}, $HoH_Filter{$filter}{$filter_line}{'threshold-1'}, $HoH_Filter{$filter}{$filter_line}{'threshold-2'}, $subtraction, '(WAIVED)', ); next; } say $output join (' ', $HoH_Input{$file}{$line}{'scenario'}, $HoH_Input{$file}{$line}{'pins'}, $HoH_Input{$file}{$line}{'threshold-1'}, $HoH_Input{$file}{$line}{'threshold-2'}, $HoH_Input{$file}{$line}{'subtraction'}, $HoH_Input{$file}{$line}{'notation'}, ); } } } } close $output or warn "Could not close ".$result.": $!"; __END__ $ cat output.txt abcd124 klmn124 100.00 2500.00 -2400.00 (WAIVED) abcd123 klmn123 100.00 1000.00 -900.00 (VIOLATED)