Perl: selective printing of lines

Hi,

I have a file with lines like this.

2 7 18 ggcgt anna
2 7 18 hhchc sam
3 7 18 hhdjcc ross
4 7 18 hhcjd  jenny
0 8  21 jjdhs  sam
3 8  21 kkok  bush
2 9  24 kosss  Brenham

If the values of the second column are equal, print only those lines with the least first column value. So in this example, the value 7 is same is in the first 4 lines; and the least first column value among those lines is 2. so I want only the first 2 lines.

desired output is,

2 7 18 ggcgt anna
2 7 18 hhchc sam
0 8  21 jjdhs  sam
2 9  24 kosss  Brenham

I tried this code but getting all kinds of errors.

#! usr/bin/perl
use warnings;
@b = ();

while (<>) {

 s/^\s+//g;
 chomp ($count = s/>/">"/g);
chomp($str = "$count $_");
 
  @a = split /\s+/, $str;

 push (@b, @a);
 chomp (@b);
 $i = 0;
 $j = 1;
 
 for ($i < 1000) {

  if ($b[$i] = $b[$i+=18]) {

                if ($b[$j] < $b[$j+=18] ) {


           print $str;}}}}

I want the code only in perl. thanks in advance. :b:

$
$
$ cat data.txt
2 7 18 ggcgt  anna
2 9 24 kosss  Brenham
4 7 18 hhcjd  jenny
3 8 21 kkok   bush
2 7 18 hhchc  sam
0 8 21 jjdhs  sam
3 7 18 hhdjcc ross
$
$
$ perl -lne 'push @x, $_;
             END {
               @y = sort { (split " ", $a, 2)[1] <=> (split " ", $b, 2)[1]
                           or
                           (split " ", $a, 2)[0] <=> (split " ", $b, 2)[0]
                         } @x;
               foreach $i (@y) {
                 @k = split / /, $i;
                 print $i if ! defined $pk1 or ($k[1] != $pk1) or ($k[1] == $pk1 and $k[0] == $pk0);
                 $pk0 = $k[0]; $pk1 = $k[1]
               }
             }
            ' data.txt
2 7 18 ggcgt  anna
2 7 18 hhchc  sam
0 8 21 jjdhs  sam
2 9 24 kosss  Brenham
$
$

tyler_durden

1 Like
sort -k2,2 -k1,1 INPUTFILE | perl -lane '                                 
  $F[1] != $prev1                   and $t = 1, print;
  $t && $F[0] == $prev0             and print;
  $F[0] != $prev0 && defined $prev0 and $t = 0 ;
  $prev0 = $F[0]; $prev1 = $F[1]
'

@durden_tyler and @yazu

Thanks a bunch for your replies. I was trying run the script from perl file rather than from the command line and I am getting "uninitialized values $i" in the first code and same error for multiple variables in the second code. Can you please provide the same code in the script mode.

I am beginner of perl and I have been banging my head since today morning to write this script. If possible, can you guys explain the codes briefly ? I really appreciate your help. Thanks again.

I can suggest, that you either:

  1. want a work to be done, or
  2. want to learn perl, or
  3. want to do your homework.
    It's not the first case, because you want specifically a perl solution. I can't say it is the second because you don't know about 'my' construction - and you can't learn anything without knowing elementary things. So you don't want to learn perl and it can be suggested that you just want to get a solution for your exercise. Ok, maybe someone will want to do it for you but it's just not me.

Its actually both 1 and 2. I am trying to finish the work by using/learning perl. I know about "my" construction. But I thought of it as an option as mentioned in the 'basic' perl book. While I appreciate your first reply in this thread, based on your replies in past threads and the second reply in this thread, I reckon you are very judgmental and your comments are presumptuous. Its not that I have not tried; I have provided the code. You either suggest something specific to the code or stay off. Thanks.