#!/usr/bin/env perl use strict; use warnings; my $data = "test1 ERROR1 ERROR1:TYPE1 test2 ERROR1 ERROR1:TYPE2 test3 ERROR2 ERROR2:TYPE1 test4 ERROR1 ERROR1:TYPE1 test5 ERROR2 ERROR2:TYPE1 test6 ERROR2 ERROR2:TYPE2 "; my @data = map [ split /\s+/, $_ ], split "\n", $data; my %nested; for (@data) { my ($file, $error, $type) = @$_; push @{ $nested{$error}{$type} }, $file; } for my $error (sort keys %nested) { print "\n##", $error, $/; for my $type (sort keys %{ $nested{$error} }) { print '#', $type, $/; print join( ', ', @{ $nested{$error}{$type} } ), $/; } } __DATA__ outputs: ## ERROR1 # ERROR1:TYPE1 test1, test4 # ERROR1:TYPE2 test2 ## ERROR2 # ERROR2:TYPE1 test3, test5 # ERROR2:TYPE2 test6