When sorting numeric data you notice that the order doesn’t seem right:
1 2 3 4 5 6 |
$ sort somedata 2 200 21 250 $ |
You need to tell sort that the data should be sorted as numbers. Specify a numeric sort with the -n option:
1 2 3 4 5 6 |
$ sort -n somedata 2 21 200 250 $ |
There is nothing wrong with the original (if odd) sort order if you realize that it is an alphabetic sort on the data (i.e., 21 comes after 200 because 1 comes after 0 in an alphabetic sort).
Of course, what you probably want is numeric ordering, so you need to use the -n option.
sort -rn can be very handy in giving you a descending frequency list of something when combined with uniq -c.
For example, let’s display the most popular shells on this system:
1 2 3 4 5 |
$ cut -d':' -f7 /etc/passwd | sort | uniq -c | sort -rn 20 /bin/sh 10 /bin/false 2 /bin/bash 1 /bin/sync |
cut -d’:’ -f7 /etc/passwd isolates the shell from the /etc/passwd file.
Then we have to do an initial sort so that uniq will work. uniq -c counts consecutive, duplicate
lines, which is why we need the pre-sort.
Then sort -rn gives us a reverse, numerical sort, with the most popular shell at the top.
If you don’t need to count the occurrences and just want a unique list of values—i.e., if you want sort to remove duplicates—then you can use the -u option on the sort command (and omit the uniq command).
So to find just the list of different shells on this system:
1 |
cut -d':' -f7 /etc/passwd | sort -u |