Quick Question: Sorting

Hi fellow linuxers

I have a quick question... I would like to sort the numbers in each line that are within a file, and I want to sort them so that the numbers in each line go from SMALLEST to HIGHEST. For example, my file looks like this:

6 4 2 3 1 5 7 8
15 16 11 13 12 14 20 18 19 17
24 26 25 21 22 23 
34 32 31 36 35 33 38 37

and I want it to look like this:

1 2 3 4 5 6 7 8
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26
31 32 33 34 34 36 37 38

Any advice on how I can do this?? Thanks everyone!

lucshi09

I don't know how efficient this is, but it might work well enough if your files are small:

awk '
  {
     split( $0, a, " " ); 
     asort( a ); 
     for( i = 1; i <= length( a ); i++ ) 
        printf( "%d ", a );
      printf( "\n" ); 
   }
' input-file >output-file 

There used to be a bug in asort , so go with caution. Also, asort is a gnu extension (I believe) so it might not be available. You could write a small sort function in the awk programme; again I don't know how efficient that is. I use a small bubble sort function, to avoid asort, but only in conjunction with small tasks because of a concern for efficiency.

EDIT: I ran a quick test to sort 25 values per line, over 100,000 lines. It took 10.6s on my not so speedy laptop.

 
$ perl -lane '@a=sort @F;print join " ",@a' input.txt
1 2 3 4 5 6 7 8
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26
31 32 33 34 35 36 37 38

perl -lane 'print join " ", sort {$a <=> $b} @F' input.txt

@itkamaraj: Numerical sorting :slight_smile:

tr -s ' ' '\n' < filename | sort | tr -s '\n' ' '  

if it is not working, try to read one by one line using loop and use the above command

Similar post : Sort each row (horizontally) in AWK or any

Further to post #5 , you'd need to read the file line-by-line, then sort the contents of the line. Also lose the "-s" switch to "tr".

cat filename.txt | while read line
do
        sorted=`echo "${line}" | tr " " "\n"| sort -n | tr "\n" " "`
        echo "${sorted}" | sed 's/ $//g'
done

./scriptname
1 2 3 4 5 6 7 8
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26
31 32 33 34 35 36 37 38

Script has a flaw because it introduces a trailing space character on each record, hence the sed to remove that character.

If you have a modern Shell, the newer syntax is preferred:

while read line
do
        sorted=$(echo "${line}" | tr " " "\n"| sort -n | tr "\n" " ")
        printf "${sorted}\n" | sed 's/ $//g'
done < filename.txt

this is really great everyone... thank you so much for your prompt responses! Super helpful indeed! :slight_smile: