开发者

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.)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜