Sorting 如何在Unix中对字母数字字符串进行排序?
我有一个表名列表,这些表名不符合顺序。我怎样才能使它们按正确的逻辑顺序排列Sorting 如何在Unix中对字母数字字符串进行排序?,sorting,vim,editor,Sorting,Vim,Editor,我有一个表名列表,这些表名不符合顺序。我怎样才能使它们按正确的逻辑顺序排列 $cat list.txt $cat list.txt |排序-n 预期订单: TAB1 TAB2 TAB3 TAB8 TAB9 TAB10 TAB11 TAB12 TAB13 TAB16 TAB17 TAB18 TAB19 TAB20 任何vim捷径都可以,我不一定需要单独的实用程序来实现这一点。您需要告诉它您的排序键从哪里开始: sort -n -k1.4 list.txt 否则它将从头开始,无法将字符串转换为数
$cat list.txt
$cat list.txt |排序-n
预期订单:
TAB1
TAB2
TAB3
TAB8
TAB9
TAB10
TAB11
TAB12
TAB13
TAB16
TAB17
TAB18
TAB19
TAB20
任何vim捷径都可以,我不一定需要单独的实用程序来实现这一点。您需要告诉它您的排序键从哪里开始:
sort -n -k1.4 list.txt
否则它将从头开始,无法将字符串转换为数字,并返回到字母顺序比较。由于这被标记为一个Vim问题,我认为可能值得一提的是Vim选项(即使我个人会使用
排序,因为数据已经在文件中)。这很简单
:sort n
由于Vim的数字排序最多忽略第一个十进制数,因此不需要忽略“TAB”(:sort
可以忽略一个模式,:sort n/TAB/
也可以忽略)。如往常一样,:h:sort
了解更多信息。您可以在Perl或任何语言中执行此操作,其中sort允许您指定比较运算符:
sub numcomp(){
$a=~/([0-9]*)$/;$aa=$1;
$b=~/([0-9]*)$/;$bb=$1;
$aa$bb;
}
排序numcomp@mylist
(不要费心告诉我这是婴儿Perl。我……嗯,我是故意这样写的,所以很容易理解。)
(不要麻烦告诉我这是错的。我……嗯,我是故意这样写的,作为读者的练习。)您可以始终使用参数-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
我花了一点时间才弄明白-k是如何工作的:1是字段号,4是字符。如果在T in选项卡后面有一个空格(默认的字段分隔符),那么您可以使用sort-n-k2.4list.txt
。可以使用-t指定自定义字段分隔符sort-n-tB-k2.1 list.txt也可以工作,因为选项卡中的B将划分字段,我们将根据第二个字段的第一个字符排序到行末。谢谢。我不知道这件事。删除字符串、排序并放回字符串让我经历了很多痛苦。@jeffjose:只有在所有情况下都使用相同的字符串时,这才很容易;如果你不这样做,它就会失败。最糟糕的情况是无法将sort-kX.Yn
shell命令传递到固定位置。我经常不得不编写一个Perl脚本来处理这些情况,但愿我没有这样做。类似地,当字段数量可变时,按最后一个字段进行排序,尽管在这里您可以颠倒字段顺序,对其进行排序,然后再将其颠倒过来。书签是一个很好的问题(有一些很好的答案),您应该提一下,根据手册,“-V”代表“-version sort”,描述为“文本中的自然排序(版本)数字”——摘自Ubuntu20.04标准存储库。因此,它的行为可能并不完全符合预期。
:sort n
$a =~ /([0-9]*)$/; $aa = $1;
$b =~ /([0-9]*)$/; $bb = $1;
$aa <=> $bb;
$ 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