How can I sort alphanumeric strings in Unix?
I have a list of table names, which are out of order. How can I get them in the correct logical order?
$ cat list.txt
TAB1
TAB13
TAB11
TAB19
TAB2
TAB3
TAB16
TAB17
TAB18
TAB9
TAB10
TAB8
TAB12
TAB20
$ cat list.txt | sort -n
TAB1
TAB10
TAB11
TAB12
TAB13
TAB16
TAB17
TAB18
TAB19
TAB2
TAB20
TAB3
TAB8
TAB9
Expected order:
TAB1
TAB2
TAB3
TAB8
TAB9
TAB10
TAB11
TA开发者_运维问答B12
TAB13
TAB16
TAB17
TAB18
TAB19
TAB20
Any vim short-cuts will also do, I do not necessarily need a separate utility for this.
You can always perform sort with argument -V to sort alphanumeric string..
$ sort -V inputfile > outputfile
$ cat inputfile
TAB1
TAB13
TAB11
TAB19
TAB2
TAB3
TAB16
TAB17
TAB18
TAB9
TAB10
TAB8
TAB12
TAB20
$ cat outputfile
TAB1
TAB2
TAB3
TAB8
TAB9
TAB10
TAB11
TAB12
TAB13
TAB16
TAB17
TAB18
TAB19
TAB20
You need to tell it where your sorting key starts:
sort -n -k1.4 list.txt
Otherwise it starts from the beginning, fails to convert a string to a number and falls back to alphabetical comparison.
Since this is tagged as a Vim question, I figured it might be worth mentioning the Vim option (even though I would personally use sort
since the data's already in a file). It's simply
:sort n
Since Vim's numeric sort ignores up to the first decimal number, one doesn't need to ignore the "TAB" (:sort
can take a pattern to ignore, :sort n /TAB/
would work as well, for example). As usual, :h :sort
for more information.
You can do this in Perl or any language where sort lets you specify a comparison operator:
sub numcomp() {
$a =~ /([0-9]*)$/; $aa = $1;
$b =~ /([0-9]*)$/; $bb = $1;
$aa <=> $bb;
}
sort numcomp @mylist...
(Don't bother telling me it's baby Perl. I... um, I wrote it that way on purpose so it would be easy to understand.) (Don't bother telling me it's wrong. I... um, I wrote it that way on purpose as an exercise for the reader.)
精彩评论