【问题标题】:How can I sort alphanumeric strings in Unix?如何在 Unix 中对字母数字字符串进行排序?
【发布时间】:2010-11-25 17:22:33
【问题描述】:

我有一个乱序的表名列表。我怎样才能让它们以正确的逻辑顺序排列?

$ 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 快捷方式也可以,我不一定需要单独的实用程序。

【问题讨论】:

  • 书签,因为这是一个很好的问题(有一些很好的答案)

标签: sorting vim editor


【解决方案1】:

您始终可以使用参数 -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  

【讨论】:

  • 您应该提到,根据手册,“-V”代表“--version-sort”,被描述为“文本中(版本)数字的自然排序”——取自 Ubuntu 20.04 标准存储库。所以它的行为可能并不完全符合预期。
【解决方案2】:

你需要告诉它你的排序键从哪里开始:

sort -n -k1.4 list.txt

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

【讨论】:

  • 我花了一点时间才弄清楚 -k 是如何工作的:1 是字段编号,4 是字符。如果 TAB 中的 T 后面有一个空格(默认字段分隔符),那么您将使用 sort -n -k2.4 list.txt。您可以使用 -t 指定自定义字段分隔符。 sort -n -tB -k2.1 list.txt 也可以,因为 TAB 中的 B 会划分字段,我们会将第二个字段的第一个字符排序到行尾。
【解决方案3】:

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

:sort n

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

【讨论】:

  • 谢谢。不知道这个。我不得不经历很多痛苦的删除 string,对其进行排序并放回 string。
  • @jeffjose:只有在所有情况下都有相同的字符串时,这才容易工作;当你不这样做时它会失败。最糟糕的是当您无法将sort -kX.Yn shell 命令传递给固定位置时。我经常不得不编写一个 Perl 脚本来处理这些情况,但我希望我没有这样做。类似地,当存在可变数量的字段时按最后一个字段进行排序,尽管您可以反转字段顺序,对其进行排序,然后再次将其反转。
【解决方案4】:

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

sub numcomp() {

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

}

排序 numcomp @mylist...

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

【讨论】:

    猜你喜欢
    • 2021-09-19
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多