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

Laz*_*zer 17 sorting vim editor

我有一个表名列表,这些名称不正常.如何以正确的逻辑顺序获取它们?

$ cat list.txt

TAB1
TAB13
TAB11
TAB19
TAB2
TAB3
TAB16
TAB17
TAB18
TAB9
TAB10
TAB8
TAB12
TAB20
Run Code Online (Sandbox Code Playgroud)

$ cat list.txt | sort -n

TAB1
TAB10
TAB11
TAB12
TAB13
TAB16
TAB17
TAB18
TAB19
TAB2
TAB20
TAB3
TAB8
TAB9
Run Code Online (Sandbox Code Playgroud)

预期订单:

TAB1
TAB2
TAB3
TAB8
TAB9
TAB10
TAB11
TAB12
TAB13
TAB16
TAB17
TAB18
TAB19
TAB20
Run Code Online (Sandbox Code Playgroud)

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

小智 26

您始终可以使用参数-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  
Run Code Online (Sandbox Code Playgroud)


cab*_*nga 23

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

sort -n -k1.4 list.txt
Run Code Online (Sandbox Code Playgroud)

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

  • 我花了一些时间来弄清楚-k是如何工作的:1是字段编号,4是字符.如果在TAB中的T之后有一个空格(默认字段分隔符),那么您将使用`sort -n -k2.4 list.txt`.您可以使用-t指定自定义字段分隔符.`sort -n -tB -k2.1 list.txt`也可以工作,因为TAB中的B将划分字段,我们将第二个字段的第一个字符排序到行尾. (7认同)

fow*_*fow 7

由于这被标记为Vim问题,我认为值得一提的是Vim选项(即使我个人会使用,sort因为数据已存在于文件中).这很简单

:sort n
Run Code Online (Sandbox Code Playgroud)

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