代码之家  ›  专栏  ›  技术社区  ›  Aakash Goel

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

  •  15
  • Aakash Goel  · 技术社区  · 14 年前

    我有一个表名列表,这些表名顺序不对。我怎样才能使它们按正确的逻辑顺序排列?

    $ 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 回复  |  直到 14 年前
        1
  •  23
  •   cababunga    14 年前

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

    sort -n -k1.4 list.txt
    

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

        2
  •  26
  •   zishe    11 年前

    您始终可以使用参数-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  
    
        3
  •  7
  •   fow    14 年前

    由于这被标记为一个Vim问题,我想可能值得一提Vim选项(尽管我个人会使用 sort 因为数据已经在一个文件中了)。很简单

    :sort n
    

    由于Vim的数字排序忽略了第一个十进制数,因此不需要忽略“TAB”( :sort 可以忽略一个模式, :sort n /TAB/ 例如,也可以)。像往常一样, :h :sort 更多信息。

        4
  •  2
  •   eshafto    14 年前

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

    sub numcomp() {

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

    }

    排序numcomp@mylist。。。

    (不用麻烦告诉我这是小Perl。我。。。嗯,我是故意这么写的,所以很容易理解。) (别费心告诉我是错的。我。。。嗯,我是故意这样写的,作为给读者的练习。)