#!/usr/bin/perl use strict; # https://perlmonks.org/?node_id=11129561 use warnings; my %hash; while( ) { my ($one, $two, $three) = split /\s{2,}|\n/; $hash{$one}{$two}{$three}++; } for my $value ( values %hash ) { $_ = [ sort keys %$_ ] for values %$value; } use Data::Dump 'dd'; dd \%hash; __DATA__ 900000001 Network1 Login 900000002 Network1 2019-11-07T20:31:10.000Z 900000002 Network1 2021-02-19T13:47:25.000Z 900000002 Network1 2021-03-10T13:58:50.000Z 900000003 No Network1 NOT Registered 900000004 Network1 Login 900000005 Network1 Login 900000006 Network1 Login2 900000007 Network1 2021-03-10T17:11:24.000Z 900000007 Network1 2021-02-18T08:34:58.000Z 900000007 Network1 2021-01-25T17:19:44.000Z 500000008 Network1 2021-03-10T17:11:24.000Z 500000008 Network2 Not Used 500000008 Network1 2021-03-11T17:12:42.000Z 500000008 Network3 Not Used 400000008 Network1 2021-01-25T17:19:36.000Z #### { 400000008 => { Network1 => ["2021-01-25T17:19:36.000Z"] }, 500000008 => { Network1 => ["2021-03-10T17:11:24.000Z", "2021-03-11T17:12:42.000Z"], Network2 => ["Not Used"], Network3 => ["Not Used"], }, 900000001 => { Network1 => ["Login"] }, 900000002 => { Network1 => [ "2019-11-07T20:31:10.000Z", "2021-02-19T13:47:25.000Z", "2021-03-10T13:58:50.000Z", ], }, 900000003 => { "No Network1" => ["NOT Registered"] }, 900000004 => { Network1 => ["Login"] }, 900000005 => { Network1 => ["Login"] }, 900000006 => { Network1 => ["Login2"] }, 900000007 => { Network1 => [ "2021-01-25T17:19:44.000Z", "2021-02-18T08:34:58.000Z", "2021-03-10T17:11:24.000Z", ], }, }