这就是我要排序的数据。但sort
将数字视为字符串,数据没有按我的预期排序。
/home/files/profile1
/home/files/profile10
/home/files/profile11
/home/files/profile12
/home/files/profile14
/home/files/profile15
/home/files/profile16
/home/files/profile2
/home /文件/配置文件3
/主/文件/配置文件4
/主/文件/配置文件5
/主/文件/配置文件6
/主/文件/配置文件7
/主/文件/配置文件8
/主/文件/配置文件9
我想将其排序为
/home/files/profile1
/home/files/profile2
/home/files/profile3
/home/files/profile4
/home/files/profile5
/home/files/profile6
/home/files/profile7
/home/files/profile8
/home /文件/配置文件9
/家/文件/配置文件10
/家/文件/配置文件11
/家/文件/配置文件12
/家/文件/配置文件14
/家/文件/配置文件15
/家/文件/配置文件16
bash脚本有什么好方法吗?我不能在这里使用 ruby 或 python 脚本。
答案1
这非常类似于这个问题。问题在于,您有一个要排序的字母数字字段,并且-n
没有明智地对待它,但版本排序 ( -V
) 却这样做了。因此使用:
sort -V
请注意,目前 GNU、FreeBSD 和 OpenBSD 排序实现都支持此功能。
答案2
您可以使用临时哨兵字符来分隔数字:
$ sed 's/\([0-9]\)/;\1/' log | sort -n -t\; -k2,2 | tr -d ';'
这里,哨兵字符是“;” - 它不能是您想要排序的任何文件名的一部分 - 但您可以交换“;”与任何你喜欢的角色。您必须相应地更改sed
,sort
和tr
部分。
该管道的工作原理如下:该sed
命令在任何数字之前插入标记,该sort
命令将标记解释为字段分隔符,使用第二个字段作为数字排序键进行排序,然后该tr
命令再次删除标记。
并log
表示输入文件 - 您还可以将输入通过管道传输到sed
.
答案3
如果所有文件名在最终数字部分之前都有相同的前缀,则在排序时忽略它:
sort -k 1.20n
(20 是第一个数字的位置。它是 1 加 的长度/home/files/profile
。)
如果你有几个不同的非数字部分,插入哨兵。