On Thu, Jun 26, 2008 at 9:42 AM, yitzle <[EMAIL PROTECTED]> wrote: > On Thu, Jun 26, 2008 at 8:18 AM, vikingy <[EMAIL PROTECTED]> wrote: > > Hi all, > > > > I have two files,one is label file,another is thickness file, they are > one to one correspondence, for example: > > the label file is : 2 2 3 2 1 3 4 > 5 2 5 1 4 ...... > > the thickness file is: 0.3 0.8 0.2 0.1 2.4 0.9 3.2 0.2 > 0.1 0.3 2.1 2.3 ...... > > Now I want to calculate the sum and mean thickness of the same labeled, > just like this: > > label 1 : 2.4 > > label 2 : (0.3+0.8+0.1 +0.1)/4 > > label 3 : (0.2+2.4)/2 > > label 4 : (3.2+2.3)/2 > > label 5 : (0.2+0.3)/2 > > ....... > > and then there is also a index [3 4] to select the label, so in the end > ,I want to get the sum and mean of (0.2+2.4)/2, (3.2+2.3)/2. > > > > I'm a beginner to perl, and don't know how to implement this with > perl,could you give me some suggestion? thanks in advance! > > > > bin lv > > For the first part of your question: > If the info in the file is all on one line, you can either (1) read in > the entire line and use the split() function to split it up into an > array or, if there is a fixed number of spaces between records, you > can set > local $/ = " "; > (See perldoc perlvar) > For a large amount of data, the second method would be faster. > > You can then use a hash to store the information for each label. > > __CODE__ > my %data; > open my $thicknessFH, "< thickness.txt" or die; > open my $labelFH, "< labels.txt" or die; > local $/ = " "; > > # Process the files > while ( my $label = <$labelFH> ) { > my $thickness = <$thicknessFH>; > $data{ $label }{ 'count' }++; > $data{ $label }{ 'thickness' } += $thickness; > } > > # Display results > for my $label ( sort keys %data ) { > local $\ = "\n"; # Auto-append newlines to prints > print "Label $label: " . ( $data{ $label }{ 'thickness' } / $data{ > $label }{ 'count' }; > } > __END__ > > I don't fully understand how you'd like to deal with indexes like [3 4]... > > -- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > http://learn.perl.org/ >
another way to handle the one line input is to read the whole line at once and then use regex to extract each column __CODE__ #!/usr/bin/perl use strict; use warnings; my $label_file = "label.in"; my $thickness_file = "thickness.in"; open my $fp_l, "<", $label_file or die "Cannot open $label_file"; my $label = <$fp_l>; close $fp_l; open my $fp_t, "<", $thickness_file or die "Cannot open $thickness_file"; my $thick = <$fp_t>; close $fp_t; my @labels = ($label =~ /(\d+)\s+/g); my @thicks = ($thick =~ /(\d*\.\d*)\s+/g); my %data; for my $i( 0 .. $#labels) { $data{$labels[$i]}{count}++; $data{$labels[$i]}{thick} += $thicks[$i]; } for my $key (sort {$a <=> $b} keys %data) { print "label: ", $key, "\tcount: ",$data{$key}{count},"\tvalue:", $data{$key}{thick}/$key,"\n"; } __END__