{ "test": [ { "group": "ABC1", "values": [ "abc", "xyz" ] }, { "group": "ABC2", "values": [ "abc2", ] }, { "group": "ABC3", "values": [ "xyz3" ] } ] } #### open(my $fh, '<', "$file_path") or return 0; while (my $line = <$fh>) { # ........... # ........... # Additional operations of the lines of the file # ........... # ........... my %a; # temp hash $a{"group"} = $group; if (defined($href->{"values"})) { $a{"values"} = [sort(uniq($value,@{$href->{"values"}}))]; } else { push(@{$a{"values"}},$value); } push(@{$href->{"test"}},\%a); } #### { "root": [ { "test": [ { "group": "XYZ", "values": [ "1234" ] }, { "group": "ABC", "values": [ "6.13.00" ] } ] }, { "test": [ { "group": "XYZ", "values": [ "tcsh" ] }, { "tool": "WEA", "values": [ "6.13.00" ] } ] }, { "test": [ { "group": "BAB", "values": [ "ASDAS", "12312321" ] }, { "group": "SADA", "values": [ "6.13.00", "1231231" ] } ] } ] } #### sub parse_file { my ($file_path,$href) = @_; open(my $fh, '<', "$file_path") or return 0; while (my $line = <$fh>) { chomp($line); unless ($line =~ /\A[^,]+(?:,[^,]+){5}\z/) { next; } my ($key,$group,$value,$version,$file,$count) = split(/,/,$line); push @{ $href->{test} }, { group => $group, values => [ sort uniq $value, @{ $href->{values} // [] } ] }; } close ($fh); return 1; } foreach my $dir (sort(@list_of_dirs)) { my ($all,%data); $all = $dir."/"."galish"; prase_results_raw($all,\%data); push(@all_data,\%data); } #### { "root": [ { "test": [ { "group": "XYZ", "values": [ "1234" ] }, { "group": "ABC", "values": [ "6.13.00" ] } ] }, { "test": [ { "group": "XYZ", "values": [ "tcsh" ] }, { "tool": "WEA", "values": [ "6.13.00" ] } ] }, { "test": [ { "group": "BAB", "values": [ "ASDAS", ] }, { "group": "BAB", "values": [ "12312321" ] }, { "group": "SADA", "values": [ "6.13.00", ] } { "group": "SADA", "values": [ "1231231" ] } ] } ] }