Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 如何在Unix中对字母数字字符串进行排序?_Sorting_Vim_Editor - Fatal编程技术网

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