1

I have a several files that have contain product install information. I am able to grep for the elements that I want (for example, "version") from the files. And I end up with something like this:

instancefile1:ABC_version=1.2.3 
instancefile1:XYZ_version=2.5 
instancefile2:ABC_version=3.4.5 
instancefile3:XYZ_version=1.1

Where the components are named ABC or XYZ.

What I'd like to do is take this grep output and parse it through perl to build arrays on the file. The first array would be composed of the instance number (pulled from the filenames) - above, I'd have an array that would have 1,2,3 as elements.

And inside each of those arrays would be the components that that particular instance has.

Full expected arrays and components from above:

array[0] = instancefile1 # can keep this named like the filename, or assign name. Does not matter

 array[0][0] = ABC_version=1.2.3
 array[0][1] = XYZ_version=2.5

array[1] = instancefile2

array[1][0] = ABC_version=3.4.5

array[2] = instancefile3

array[2][0] = XYZ_version=1.1

(I know my notation for referencing subarrays is not correct - I'm rusty on my perl.)

How might I do that? (I've been doing it with just bash arrays and grep and then reiterating through the initial grep output with my first array and doing another grep to fill another array - but this seems like it is going through the data more than one time, instead of building it on the fly.)

The idea is for it to build each array as it sees it. It sees "fileinstance1", it stores the values to the right in that array, as it sees it. Then if it sees "fileinstance2", it creates that array and populates with those values, all in one pass. I believe perl is the best tool for this?

1 Answer 1

1

Unless you can guaranteed the records with the same key will be next to each other, it's easier to start with a HoA.

my %data;
while (<>) {
   chomp;
   my ($key, $val) = split /:/;
   push @{ $data{$key} }, $val;
}

Then convert to AoA:

my @data = values(%data);

Order-preserving:

my %data;
my @data;
while (<>) {
   chomp;
   my ($key, $val) = split /:/;
   push @data, $data{$key} = []
      if !$data{$key};

   push @{ $data{$key} }, $val;
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.