如何使用bash脚本对字符串+数字组合的字符串进行排序?

如何使用bash脚本对字符串+数字组合的字符串进行排序?

这就是我要排序的数据。但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,sorttr部分。

该管道的工作原理如下:该sed命令在任何数字之前插入标记,该sort命令将标记解释为字段分隔符,使用第二个字段作为数字排序键进行排序,然后该tr命令再次删除标记。

log表示输入文件 - 您还可以将输入通过管道传输到sed.

答案3

如果所有文件名在最终数字部分之前都有相同的前缀,则在排序时忽略它:

sort -k 1.20n

(20 是第一个数字的位置。它是 1 加 的长度/home/files/profile。)

如果你有几个不同的非数字部分,插入哨兵

相关内容