Hi all,

I am trying to make script to find the max value at the number that was decided by user.
The data has two colum [fw] and [rw] and I hope I can find the max values of each colum.

in put :

posi (not have in data)
	Fw	Rw
1	10	1
2	24	0
3	20	3
4	26	0
5	34	0
etc.......

I hope data : If I enter decided number at 10

num     posi       fw       rw
1	5	34	0
2	4	26	0
3	2	24	3
4	3	20	0
5	1	10	1

I sued the script to sort data but I can not find the first value. I mean

5      1         10        0
#!/usr/bin/perl;
use strict; 
use warnings; 
use Data::Dumper;
my $n = 31;#Decided position
my $put = 'thu1.txt';
my $filename =   'hoi.txt';
open my $fh, '<', $filename or die "Failed to open $filename: $!";
open my $fh1, '>',$put or die "Failed to open $put: $!";
my $i =1;
while (<$fh>){
    next if m/^#/;#Skip comment lines
    my @array = ();
    foreach (1 .. $n){
        my $rec = <$fh>;
        last unless defined $rec;        
        $rec =~ s/\s*$//;#Remove spaces or newline characters from end
        push @array, $rec;    
    }
    @array = sort   {my ($sa, $sa1) = split /\s+/, $a;
                    my ($sb,$sb1) = split /\s+/, $b;
                    $sb <=> $sa;} @array;   
    foreach(@array){
        print $fh1 "$i\t$_\n";
        $i++;
  }
 }

and then I used small script to find the max value

#!/usr/bin/perl;
use strict; 
use warnings; 
my $put = 'thu1.txt';
open my $fh, '<', $put or die "Failed to open $put: $!";
print "nhap so vao ";
my $so =<STDIN>;
while (<$fh>){       
   chomp($fh);
    my $rec = $fh;
    my ($nu, $fw, $rw) =split (/\t/,$_);
    chomp ();
    #print "$po\n";
    if ($nu <= $so) {print "$nu\t$fw\t$rw"}
}

Could you show me what wrong in that script and how to make it by one script? thank you very much.

Recommended Answers

Not really sure what is going now, but I will take a guess. I think this does what you want. The first value was lost in the read at the top of the while loop. That is why I changed the order where $rec is read.
Hope this helps.

       
Jump to Post

All 4 Replies

Not really sure what is going now, but I will take a guess. I think this does what you want. The first value was lost in the read at the top of the while loop. That is why I changed the order where $rec is read.
Hope this helps.

#!/usr/bin/perl
use strict; 
use warnings; 
use Data::Dumper;

# Not sure what this is really used for
my $n = 31;    #Decided position
my $filename = 'hoi.txt';
open my $fh, '<', $filename or die "Failed to open $filename: $!";
my $i =1;
# Why this loop and the other?
while (my $rec = <$fh>){
    next if $rec =~ m/^#/; #Skip comment lines
    my @array = ();
    # Again, not sure why the loop in here
    # Why one $n times?
    foreach (1 .. $n){
        last unless defined $rec;        
        $rec =~ s/\s*$//;   #Remove spaces or newline characters from end
        push @array, $rec;    
        $rec = <$fh>;
    }
    @array = sort { my ($sa, $sa1) = split /\s+/, $a;
                    my ($sb,$sb1) = split /\s+/, $b;
                    $sb <=> $sa;
                  } @array;   

    print "nhap so vao ";
    my $so =<STDIN>;
    foreach (@array){
       print "$i\t$_\n";
       last if ($i++ >= $so);
    }
}
close($fh);

Not really sure what is going now, but I will take a guess. I think this does what you want. The first value was lost in the read at the top of the while loop. That is why I changed the order where $rec is read.
Hope this helps.

#!/usr/bin/perl
use strict; 
use warnings; 
use Data::Dumper;

# Not sure what this is really used for
my $n = 31;    #Decided position
my $filename = 'hoi.txt';
open my $fh, '<', $filename or die "Failed to open $filename: $!";
my $i =1;
# Why this loop and the other?
while (my $rec = <$fh>){
    next if $rec =~ m/^#/; #Skip comment lines
    my @array = ();
    # Again, not sure why the loop in here
    # Why one $n times?
    foreach (1 .. $n){
        last unless defined $rec;        
        $rec =~ s/\s*$//;   #Remove spaces or newline characters from end
        push @array, $rec;    
        $rec = <$fh>;
    }
    @array = sort { my ($sa, $sa1) = split /\s+/, $a;
                    my ($sb,$sb1) = split /\s+/, $b;
                    $sb <=> $sa;
                  } @array;   

    print "nhap so vao ";
    my $so =<STDIN>;
    foreach (@array){
       print "$i\t$_\n";
       last if ($i++ >= $so);
    }
}
close($fh);

Thank you for help.
How can I do if I want to search all the data hoi.txt and it did not decide at n=31 beacuse I will use the script to run data (data size 87800 KB).

Again, I'm not too sure if this is what you want but try:

#!/usr/bin/perl
use strict; 
use warnings; 
use Data::Dumper;

# Not sure what this is really used for
my $filename = 'hoi.txt';
open my $fh, '<', $filename or die "Failed to open $filename: $!";
my $i =1;
my @array = ();
# Loop thru all of the data in the file
while (my $rec = <$fh>){
    next if $rec =~ m/^#/; #Skip comment lines
    $rec =~ s/\s*$//;   #Remove spaces or newline characters from end
    push @array, $rec;    
}
close($fh);

# Sort all of the data that was in the file
@array = sort { my ($sa, $sa1) = split /\s+/, $a;
                    my ($sb,$sb1) = split /\s+/, $b;
                    $sb <=> $sa;
                  } @array;   

print "nhap so vao ";
my $so =<STDIN>;
foreach (@array){
  print "$i\t$_\n";
  last if ($i++ >= $so);
}

Again, I'm not too sure if this is what you want but try:

#!/usr/bin/perl
use strict; 
use warnings; 
use Data::Dumper;

# Not sure what this is really used for
my $filename = 'hoi.txt';
open my $fh, '<', $filename or die "Failed to open $filename: $!";
my $i =1;
my @array = ();
# Loop thru all of the data in the file
while (my $rec = <$fh>){
    next if $rec =~ m/^#/; #Skip comment lines
    $rec =~ s/\s*$//;   #Remove spaces or newline characters from end
    push @array, $rec;    
}
close($fh);

# Sort all of the data that was in the file
@array = sort { my ($sa, $sa1) = split /\s+/, $a;
                    my ($sb,$sb1) = split /\s+/, $b;
                    $sb <=> $sa;
                  } @array;   

print "nhap so vao ";
my $so =<STDIN>;
foreach (@array){
  print "$i\t$_\n";
  last if ($i++ >= $so);
}

Thanks a lot histrungalot!
It run well. your help show me know what wrong in my script.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of 1.21 million developers, IT pros, digital marketers, and technology enthusiasts learning and sharing knowledge.