Shiping Wang wrote: > > Hi , I have following a record file like this: > > [snipped data. see below] > > What I want output is: > > Cust Prod Cata > 1711 > 842 1523 C > 9306 152 B > 24727 15225 A > 46917 9828 B > 50 4309 C > > For each customer, I only select one product based on an order of B, C, A, > D. > > I thought I might use some kind of data structure like AOA or HOH, but don't > know how. Can anyone give me a help to use perl to handle this case?
Here is one way to do it (given the supplied data): #!/usr/bin/perl -w use strict; my ( %data, $cust, $prod ); while ( <DATA> ) { if ( /^Customer ID:\s*(\d+)/ or eof ) { $cust = $1; } elsif ( /^\s+Product ID:\s*(\d+)/ ) { $prod = $1; } elsif ( /^\s+Category:\s*(\S+)/ ) { $data{$cust}{$prod} = $1; } else { $data{$cust}{''} = ''; } } for $cust ( keys %data ) { for $prod ( keys %{$data{$cust}} ) { printf "%-8s%-8s%s\n", $cust, $prod, $data{$cust}{$prod}; } } __DATA__ Customer ID: 1711 * * * No record * * * Customer ID: 842 Product ID: 716 Category:A Product ID: 1523 Category:C Product ID: 753 Category:D Product ID: 76 Customer ID: 9306 Product ID: 152 Category:B Product ID: 34762 Category:D Product ID: 1956 Category:D Customer ID: 24727 Product ID: 15225 Category:A Product ID: 9615 Category:D Customer ID: 46917 Product ID: 20401 Category:A Product ID: 9828 Category:B Product ID: 665 Category:C Product ID: 461 Category:D Product ID: 1335 Customer ID: 50 Product ID: 19554 Category:A Product ID: 4309 Category:C Output: 46917 665 C 46917 461 D 46917 9828 B 46917 20401 A 9306 34762 D 9306 152 B 9306 1956 D 24727 9615 D 24727 15225 A 1711 50 19554 A 842 1523 C 842 716 A 842 753 D John -- use Perl; program fulfillment -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]