Sort numbers which has colon (:) in between


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Sort numbers which has colon (:) in between
# 1  
Old 06-06-2012
Sort numbers which has colon (:) in between

Although i tried multiple option i couldn't find a way to get the rigt ouput.

Say i have the following data

Code:
cat file.txt
 
[1] C request
[1:1]
[1:4]
[1:2]
[1:3]
[1] C response
[2:3]
[2] C request
[2:1]
[2:2]
[2] C response

The output should look like

Code:
[1] C request
[1:1]
[1:2]
[1:3]
[1:4]
[1] C response
[2] C request
[2:1]
[2:2]
[2:3]
[2] C response

I've tried

Code:
sort -t: -k1,1n -k2,2n or sort -t: +1.1 -1.3

but no luck.

any idea?

Cheers.

Moderator's Comments:
Mod Comment edit by bakunin: please use [CODE]..[/CODE]-tags when psoting code or terminal output. Thank you.


---------- Post updated 06-06-12 at 09:09 AM ---------- Previous update was 06-05-12 at 06:37 PM ----------

Sorry - i'll remember and use it next time.

Do you have any idea on my request? Maybe i need to use awk + sort?


Thx in advance!

Last edited by bakunin; 06-05-2012 at 11:00 PM..
# 2  
Old 06-06-2012
Hi


Code:
$ sort -n file.txt | sed -n '/request/{p;s/.*//;x;p;d;}; /response/{p;n;h;T}; /request/!{1h;1!H;}'
[1] C request
[1:1]
[1:2]
[1:3]
[1:4]
[1] C response
[2] C request
[2:1]
[2:2]
[2:3]
[2] C response

Guru.
# 3  
Old 06-06-2012
Quote:
Originally Posted by guruprasadpr

Code:
$ sed -n '/request/{p;s/.*//;x;p;d;}; /response/{p;n;h;T}; /request/!{1h;1!H;}'

Guru.

Thanks a lot!! If you don't mind, can you please explain the sed command?

Many thanks!!
# 4  
Old 06-06-2012
Code:
# awk '/req||!~res/{while($0!~/res/){a[x++]=$0;getline}};{a[l]=$0;for(cc in a)if(a[cc]~/req/){print a[cc];a[cc]="";};
for(i=0;i<x;i++){split(a[i],s,":");sub("]","",s[2]);ll=s[1];f=0;s[2]=s[2];if(s[2]==1&&!f){print a[i];f=1;xx=s[2]+1;}
if(s[2]==xx&&a[i]){print s[1]":"s[2]"]";xx++;f=1;}if(a[i]&&f!=1)n[xxx++]=s[2]}for(lll=1;lll<20;lll++){
for(i=0;i<xxx;i++)if(n[i]==(ll+lll))print ll":"n[i]"]"}print a[l];;;x=xxx=0;xx=""}' unsorted_file
[1] C request
[1:1]
[1:2]
[1:3]
[1:4]
[1] C response
[2] C request
[2:1]
[2:2]
[2:3]
[2] C response

regards
ygemici

Last edited by ygemici; 06-06-2012 at 10:28 AM..
# 5  
Old 06-09-2012
Hi all,

Can anyone help me understand the above SED command?

Thanks!!
# 6  
Old 06-10-2012
Hi.

Here is an alternate solution. The utility msort has an interesting sort-field key called a hybrid. Essentially, it breaks apart a key-field into sub-fields. It then sorts the sub-fields as character unless the field is numeric, in which case it sorts as a numeric. The header and trailer lines in this data file have no second field, so a pair of perl scripts adds the field to request and response lines, and removes the second field after the hybrid sort. So for the perl add action, the lines would become:
Code:
[1:0] C request
[1:32000] C response

ready for input into msort.
Code:
#!/usr/bin/env bash

# @(#) s2	Demonstrate hybrid sort, msort.
# http://freecode.com/projects/msort

pe() { for _i;do printf "%s" "$_i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }
db() { ( printf " db, ";for _i;do printf "%s" "$_i";done;printf "\n" ) >&2 ; }
db() { : ; }
C=$HOME/bin/context && [ -f $C ] && $C msort perl

FILE=${1-data1}
pl " Input data file $FILE, and expected output:"
head -n 11 $FILE expected-output.txt
pl " Helper perl scripts:"
head p*

pl " Results:"
./p1 $FILE |
tee f1 |
msort -q -l -n 1,1 -c hybrid |
tee f2 |
./p2

exit 0

producing:
Code:
% ./s2

Environment: LC_ALL = C, LANG = C
(Versions displayed with local utility "version")
OS, ker|rel, machine: Linux, 2.6.26-2-amd64, x86_64
Distribution        : Debian GNU/Linux 5.0.8 (lenny) 
bash GNU bash 3.2.39
msort 8.44
perl 5.10.0

-----
 Input data file data1, and expected output:
==> data1 <==
[1] C request
[1:1]
[1:4]
[1:2]
[1:3]
[1] C response
[2:3]
[2] C request
[2:1]
[2:2]
[2] C response

==> expected-output.txt <==
[1] C request
[1:1]
[1:2]
[1:3]
[1:4]
[1] C response
[2] C request
[2:1]
[2:2]
[2:3]
[2] C response

-----
 Helper perl scripts:
==> p1 <==
#!/usr/bin/env perl

# @(#) p1	Augment header and trailer lines with integers.

while ( <> ) {
  s/\[(\d+)\]/[\1:0]/ if /request/;
  s/\[(\d+)\]/[\1:32000]/ if /response/;
  print;
}

==> p2 <==
#!/usr/bin/env perl

# @(#) p2	Remove integers from head and trailer lines.

while ( <> ) {
  s/:\d+// if /request|response/;
  print;
}

-----
 Results:
[1] C request
[1:1]
[1:2]
[1:3]
[1:4]
[1] C response
[2] C request
[2:1]
[2:2]
[2:3]
[2] C response

Files f1 and f2 show the intermediate form of the data and can be discarded for production work.

See the link in the script for msort if it is not in an accessible repository. Fedora, Debian, FreeBSD have it, for example.

Best wishes ... cheers, drl
# 7  
Old 06-10-2012
Quote:
Originally Posted by guruprasadpr
Code:
$ sort -n file.txt | sed -n '/request/{p;s/.*//;x;p;d;}; /response/{p;n;h;T}; /request/!{1h;1!H;}'

With the sample data, that sort command is not performing a numerical sort. Since the first character of the line is not the beginning of a numeric string, all lines compare equal, as if they all had a leading zero, and then they are compared lexicographically to break the tie. [10:1] will incorrectly precede [2:1].

The T test will always succeed -- since the n command will always reset the tested condition -- so it could be replaced with d (since -n is in effect), in which case the sed script would be portable (instead of GNU specific).

The following is a reimplementation of drl's suggestion. Instead of using perl and msort to decorate-sort-dedecorate, it uses sed and sort:
Code:
sed '/req/s/]/:0]/; /res/s/]/:9999]/; s/[][]//g' infile |
sort -nt: -k1,1 -k2,2 |
sed '/req/s/:0//; /res/s/:9999//; s/[:[:digit:]]*/[&]/'

Regards,
Alister

Last edited by alister; 06-10-2012 at 04:48 PM..
This User Gave Thanks to alister For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Sort only numbers within a string

Hi, I am having contents in a file like below, cat testfile rpool/swap rpool/swap14 rpool/swap2 rpool/swap3 I want to sort the above contents like, rpool/swap rpool/swap2 rpool/swap3 rpool/swap14 I have tried in this way, (7 Replies)
Discussion started by: Sumanthsv
7 Replies

2. Shell Programming and Scripting

Bash, remove numbers after colon

Hello All, I was wondering if someone might know how to do this. I have a word list that is format like the example below. I need to take away the :number after that... is there some kind of command I could use to remove them? 123456:5562 password:1507 123456789:989 qwerty:877... (7 Replies)
Discussion started by: 3therk1ll
7 Replies

3. Shell Programming and Scripting

How to sort a column in UNIX that is colon separated ":" ?

Experts, how to sort this fields with numerical order : -How to use the sort command in this case, I was thinking with -k but it is not working, lan5000 lan5000:1 lan5000:10 lan5000:11 lan5000:12 lan5000:13 lan5000:14 lan5000:15 lan5000:16 lan5000:17 ... (6 Replies)
Discussion started by: rveri
6 Replies

4. Shell Programming and Scripting

how to sort numbers

I have files like this: 1 3 4 6 14 3 6 I want to extract the highest number. I have tried using cat filename | sort but then 9 would become higher than 14. So how do I sort? (1 Reply)
Discussion started by: locoroco
1 Replies

5. Shell Programming and Scripting

How to sort version numbers?

I would like to know how to sort version numbers, using bash or perl. I would like to sort file names that are program names with version numbers and extensions, such as hello-0.2.3.tar.gz and hello-0.10.3.tar.gz. Version numbers of computer programs do not comply with the mathematical rule... (3 Replies)
Discussion started by: LessNux
3 Replies

6. Shell Programming and Scripting

Is it Possible to sort a list of hexadecimal numbers using "sort" command?

Hello Everybody :) !!!. i have question in mind, is it possible to sort a list of hexadecimal numbers using "sort" command? (9 Replies)
Discussion started by: Kesavan
9 Replies

7. Shell Programming and Scripting

Sort numbers

Hello, okey so my script is using 4 variables that are either empty or numbers in the following format: NUMBER_1 NUMBER_2 NUMBER_3 NUMBER_4 So they're basically separated by a space and I need to echo the lowest number, so far I've been doing it like this: echo "2 3 1 3" | tr " "... (6 Replies)
Discussion started by: TehOne
6 Replies

8. Shell Programming and Scripting

How to Sort Floating Numbers Using the Sort Command?

Hi to all. I'm trying to sort this with the Unix command sort. user1:12345678:3.5:2.5:8:1:2:3 user2:12345679:4.5:3.5:8:1:3:2 user3:12345687:5.5:2.5:6:1:3:2 user4:12345670:5.5:2.5:5:3:2:1 user5:12345671:2.5:5.5:7:2:3:1 I need to get this: user3:12345687:5.5:2.5:6:1:3:2... (7 Replies)
Discussion started by: daniel.gbaena
7 Replies

9. Shell Programming and Scripting

Sort by numbers, then alphabetically

Hey guys, I have a file that contains the following: 366 K 364 Q 12 UB 7 INC. P 4 Law 2 LAMB 2 High 1 QEG 1 OF 1 LC 1 B As you can see, it's already sorted by numerical order, how do I sort it again, breaking the ties by using the alphabetical order of the second column, but... (2 Replies)
Discussion started by: Andrew9191
2 Replies

10. Shell Programming and Scripting

How to sort a string with numbers

Hi, I need help to sort a file contents. I am using sort -r option to basically reverse the comparison in descending order. However, i found out that my file is not sorted according, can anyone please help. My data is something like:- Hello world 20.982342864 343 19.234355545 222... (5 Replies)
Discussion started by: ahjiefreak
5 Replies
Login or Register to Ask a Question