Perl script to sort data on second numeric field


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Perl script to sort data on second numeric field
# 1  
Old 09-14-2010
Lightbulb Perl script to sort data on second numeric field

Hi,

I'm a learner of PERL programming.

I've a input file with the below data:

Code:
SWAT_5, 1703, 2010-09-21
SWAT_6,  2345, 2010-09-21
SWAT_7,  1792, 2010-09-21
SWAT_8,  1662, 2010-09-21
SWAT_9,  1888, 2010-09-21
VXHARP_1,  171, 2010-09-21

I need to sort this data based on the second numeric field value and want to display only first two fields. Below is expected result:

Code:
VXHARP_1,  171
SWAT_8,  1662
SWAT_5,  1703
SWAT_7,  1792
SWAT_9,  1888
SWAT_6,  2345

I wrote the below script to accomplish this:

Code:
open( INFILE, "< $input_file") or die "cannot open input file $input_file: $!";
my @lines = <INFILE>;
close(INFILE);

@lines = sort @lines;

foreach my $line (@lines) {
  my @tokens = split(/,/, $line);
  my $id = $tokens[0];
  my $duration = $tokens[1];
  printf "$id, $duration\n";
}

But, I'm getting first field sorted output as below:

Code:
SWAT_5,  1703
SWAT_6,  2345
SWAT_7,  1792
SWAT_8,  1662
SWAT_9,  1888
VXHARP_1,  171

Please suggest me for my above code correction to sort based on second field.

Thanks and Regards / Mysore 101 Ganapati.
# 2  
Old 09-15-2010
Quote:
Originally Posted by ganapati
...
Code:
SWAT_5, 1703, 2010-09-21
SWAT_6,  2345, 2010-09-21
SWAT_7,  1792, 2010-09-21
SWAT_8,  1662, 2010-09-21
SWAT_9,  1888, 2010-09-21
VXHARP_1,  171, 2010-09-21

I need to sort this data based on the second numeric field value and want to display only first two fields. Below is expected result:

Code:
VXHARP_1,  171
SWAT_8,  1662
SWAT_5,  1703
SWAT_7,  1792
SWAT_9,  1888
SWAT_6,  2345

...
Code:
$ 
$ 
$ cat f8
SWAT_5, 1703, 2010-09-21
SWAT_6,  2345, 2010-09-21
SWAT_7,  1792, 2010-09-21
SWAT_8,  1662, 2010-09-21
SWAT_9,  1888, 2010-09-21
VXHARP_1,  171, 2010-09-21
$ 
$ 
$ perl -lne 'push @x, $_;
             END {@y = sort {(split ",", $a)[1] <=> (split ",", $b)[1]} @x;
                  print substr($_,0,rindex($_,",")) for @y
             }' f8
VXHARP_1,  171
SWAT_8,  1662
SWAT_5, 1703
SWAT_7,  1792
SWAT_9,  1888
SWAT_6,  2345
$ 
$ 

tyler_durden
# 3  
Old 09-16-2010
map - sort - map

Code:
print join "\n", map {$_->[1]} sort {$a->[0]<=>$b->[0]}map {my @tmp = split(",",$_); [$tmp[1],$tmp[0].",".$tmp[1]]} <DATA>;
__DATA__
SWAT_5, 1703, 2010-09-21
SWAT_6,  2345, 2010-09-21
SWAT_7,  1792, 2010-09-21
SWAT_8,  1662, 2010-09-21
SWAT_9,  1888, 2010-09-21
VXHARP_1,  171, 2010-09-21

# 4  
Old 09-16-2010
by shell.

Code:
sort -t, -k2n infile |cut -d, -f1,2

# 5  
Old 09-16-2010
Code:
ruby -F"," -ane 'BEGIN{h={}}; h[ [$F[0], $F[1]]] = $F[1].to_i ;END{  h.sort{|a,b| a[1]< = >b[1]}.each{|x| print "#{x[0].join(",")}\n"}  }' file


Last edited by kurumi; 09-16-2010 at 07:23 AM..
# 6  
Old 09-16-2010
Code:
perl -F"," -wlane '
push @a , [ $F[1]  , $_ ] ; 
END{ print  map {join(",",(split /,/,$_->[1])[0..1]),"\n"} sort {$a->[0]  <=> $b->[0] } @a  }
' infile.txt

Code:
o/p:-
VXHARP_1,  171
SWAT_8,  1662
SWAT_5, 1703
SWAT_7,  1792
SWAT_9,  1888
SWAT_6,  2345

# 7  
Old 09-22-2010
Hi All

Thanks a lot for all your suggestions and I have implemented 'summer cherry's logic.
Also, I tried to understand his logic, but not able to do so.

Could any one explain the below logic. I mean I know map and sort function, but don't know, how exactly below line will execute.

Quote:
print join "\n", map {$_->[1]} sort {$a->[0]<=>$b->[0]}map {my @tmp = split(",",$_); [$tmp[1],$tmp[0].",".$tmp[1]]} <DATA>;

With Regards,
Mysore Ganapati.

Last edited by ganapati; 09-22-2010 at 05:28 AM..
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Help with sort word and general numeric sort at the same time

Input file: 100%ABC2 3.44E-12 USA A2M%H02579 0E0 UK 100%ABC2 5.34E-8 UK 100%ABC2 3.25E-12 USA A2M%H02579 5E-45 UK Output file: 100%ABC2 3.44E-12 USA 100%ABC2 3.25E-12 USA 100%ABC2 5.34E-8 UK A2M%H02579 0E0 UK A2M%H02579 5E-45 UK Code try: sort -k1,1 -g -k2 -r input.txt... (2 Replies)
Discussion started by: perl_beginner
2 Replies

2. Shell Programming and Scripting

[Solved] sort on numeric part of field

I have ran into a heavy case of PEBCAK*) and could need some advice on what i do wrong: OS is Linux (kernel 2.6.35), sort --version reports "8.5" from 2010, shell is ksh. Originally i had a file with with the following structure: hdisk1 yyy hdisk2 yyy hdisk3 yyy hdisk4 yyy hdisk5 yyy... (2 Replies)
Discussion started by: bakunin
2 Replies

3. Homework & Coursework Questions

Shell script calling Perl function, sort and find data, write to new files

Use and complete the template provided. The entire template must be completed. If you don't, your post may be deleted! 1. The problem statement, all variables and given/known data: I must write a shell script that calls two external Perl functions--one of which sorts the data in a file, and... (6 Replies)
Discussion started by: kowit010
6 Replies

4. Shell Programming and Scripting

Sort help on non numeric field

Hi, I am unable to sort data on the first field $cat t Jim,212121,Seattle Bill,404404,Seattle Steve,246810,Nevada Scott,212277,LosAngeles Jim,212121,Ohio sort -t"," -k1,2 t Bill,404404,Seattle Jim,212121,Ohio Jim,212121,Seattle Scott,212277,LosAngeles Steve,246810,Nevada (7 Replies)
Discussion started by: Shivdatta
7 Replies

5. Shell Programming and Scripting

perl sort array by field

Hi Everyone, Any simple code can simplify the code below, please advice. Thanks # cat 2.pl #!/usr/bin/perl use warnings; use strict; my @aaaaa = <DATA>; my @uids; foreach (@aaaaa) { my @ccccc = split (",", $_); push @uids, $ccccc;... (3 Replies)
Discussion started by: jimmy_y
3 Replies

6. Shell Programming and Scripting

Perl sort unique by one field only

Hi all, I've searched the forum and I can find some code to sort uniquely in perl but not by a single field. I have a file with data such as the following: 1,test,34 1,test2,65 2,test,35, 1,test3,34 2,test,34 What i want to do is sort it uniqely by the first field only so I'd end... (2 Replies)
Discussion started by: Donkey25
2 Replies

7. Shell Programming and Scripting

Sort data by a DDMMYYYY field

I have a CSV file which I have to sort it by a field with DDMMYYYY format, since I'm not a unix specialist, how is the easiest way to do this? Sample data 30062008,432120,A,5001,A,201,Z ,2,MXN 31092008,432121,B,4001,B,101,Z ,2,MXN 05112008,432122,C,2001,C,51,Z ,2,MXN... (2 Replies)
Discussion started by: martinezjorge
2 Replies

8. Shell Programming and Scripting

help newb at linux and bash need numeric script sort

I am trying to setup to automatically import a series of mysql database files. I am doing manually now and its a royal pain. All the sql files are sequentially numbered in a format of 4 numbers underscore text with spaces replaced by underscores. example: There are 3 databases each setup... (1 Reply)
Discussion started by: dlm1065
1 Replies

9. Shell Programming and Scripting

how to numeric sort on field time

i want to sort time field given by who command as a whole i have tried like this who|sort -n +4 -5 (1 Reply)
Discussion started by: rahulspatil_111
1 Replies
Login or Register to Ask a Question