use strict; use warnings; my %timing1; chomp ($_=); # Hdr my @hdr = split /\s+/; while (){ chomp ; s/^\s+//; my @r=split /\s+/; $timing1{$r[1]}{$r[2]}{$r[3]}{$r[0]}=$r[4]; } foreach my $rName ( keys %timing1 ) { foreach my $tType ( sort keys %{$timing1{$rName}}) { foreach my $rF ( sort keys %{$timing1{$rName}{$tType}}){ my @by_val = map {[$timing1{$rName}{$tType}{$rF}{$_},$_]} keys %{$timing1{$rName}{$tType}{$rF}}; @by_val = sort { $a->[0] <=> $b->[0]} @by_val; foreach my $aref ( @by_val) { my ($val, $pinName) = @$aref; print " $pinName\t $rName\t $tType\t $rF\t $val \n"; } } } } __DATA__ pin Name related_pin time_type rise_fall delay DQ5_RX_CLK M2CLKP c_rise rise_transition 0.014446 DQ2_RX_CLK M2CLKP c_rise rise_transition 0.014464 DQ0_RX_CLK M2CLKP c_rise rise_transition 0.014452 DQ3_RX_CLK M2CLKP c_rise rise_transition 0.014452 DQ7_RX_CLK M2CLKP c_rise rise_transition 0.014430 DQ4_RX_CLK M2CLKP c_rise rise_transition 0.014446 DQ8_RX_CLK INT_CLK c_fall fall_transition 0.199360 DQ6_RX_CLK INT_CLK c_fall fall_transition 0.199322 DQ1_RX_CLK INT_CLK c_fall fall_transition 0.199500 DQ5_RX_CLK INT_CLK c_fall fall_transition 0.199248 DQ2_RX_CLK INT_CLK c_fall fall_transition 0.199368