Sort strings in numeric order based on unpadded numbers appearing at a set position in the string

Was setting up catch all Apache redirects for moved content and needed the numeric IDs sorted in descending order, so rules where numeric ID of one is a subset of another (e.g. /news/pr/10 and /news/pr/100 and /news/pr/1000) all get processed correctly. The sort command makes this super easy.

$ cat test
/path/to/old/100/?(.*)	/path/to/new/8494830/
/path/to/old/101/?(.*)	/path/to/new/2894822/
/path/to/old/10/?(.*)	/path/to/new/8494835/
/path/to/old/999/?(.*)	/path/to/new/2551975/
/path/to/old/110/?(.*)	/path/to/new/1294833/
/path/to/old/990/?(.*)	/path/to/new/2494234/
/path/to/old/9/?(.*)	/path/to/new/9594831/
/path/to/old/99/?(.*)	/path/to/new/4194836/
/path/to/old/90/?(.*)	/path/to/new/9294838/
/path/to/old/1000/?(.*)	/path/to/new/3498564/
/path/to/old/1/?(.*)	/path/to/new/1496534/

The following tells the sort command to use forward slash as the field delimiter (-t), look at column 5 (-k5), sort that column numerically (n), in reverse (r):

$ sort -t/ -k5nr test
/path/to/old/1000/?(.*)	/path/to/new/3498564/
/path/to/old/999/?(.*)	/path/to/new/2551975/
/path/to/old/990/?(.*)	/path/to/new/2494234/
/path/to/old/110/?(.*)	/path/to/new/1294833/
/path/to/old/101/?(.*)	/path/to/new/2894822/
/path/to/old/100/?(.*)	/path/to/new/8494830/
/path/to/old/99/?(.*)	/path/to/new/4194836/
/path/to/old/90/?(.*)	/path/to/new/9294838/
/path/to/old/10/?(.*)	/path/to/new/8494835/
/path/to/old/9/?(.*)	/path/to/new/9594831/
/path/to/old/1/?(.*)	/path/to/new/1496534/

Leave a comment

NOTE: Enclose quotes in <blockquote></blockquote>. Enclose code in <pre lang="LANG"></pre> (where LANG is one of these).