如何在Unix中对字母数字字符串进行排序?

时间:2010-11-25 17:22:34

标签: sorting vim editor

我有一个表名列表,这些表名都没有问题。如何以正确的逻辑顺序获取它们?

  

$ 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

预期订单:

TAB1
TAB2
TAB3
TAB8
TAB9
TAB10
TAB11
TAB12
TAB13
TAB16
TAB17
TAB18
TAB19
TAB20

任何vim快捷方式也会这样做,我不一定需要一个单独的实用程序。

4 个答案:

答案 0 :(得分:25)

您始终可以使用参数-V进行排序以对字母数字字符串进行排序..

$ 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  

答案 1 :(得分:22)

您需要告诉它您的排序键的开始位置:

sort -n -k1.4 list.txt

否则它从头开始,无法将字符串转换为数字并返回字母比较。

答案 2 :(得分:7)

由于这被标记为Vim问题,我认为可能值得一提的是Vim选项(即使我个人使用sort,因为数据已存在于文件中)。它只是

:sort n

由于Vim的数字排序忽略了第一个十进制数字,因此不需要忽略" TAB" (:sort可以采用一种模式来忽略,例如,:sort n /TAB/也会起作用。像往常一样,:h :sort了解更多信息。

答案 3 :(得分:2)

您可以在Perl或任何使用sort指定比较运算符的语言中执行此操作:

sub numcomp() {

 $a =~ /([0-9]*)$/; $aa = $1;
 $b =~ /([0-9]*)$/; $bb = $1;
 $aa <=> $bb;

}

sort numcomp @mylist...

$a =~ /([0-9]*)$/; $aa = $1; $b =~ /([0-9]*)$/; $bb = $1; $aa <=> $bb; (别打扰告诉我这是宝贝Perl。我......嗯,我是故意这样写的,所以很容易理解。) (不要打扰告诉我这是错的。我......嗯,我是故意这样写的,作为读者的练习。)