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


27

这是我要排序的数据。但是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 / files / profile3
/ home / files / profile4
/ home / files / profile5
/ home / files / profile6
/ home / files / profile7
/ home / files / profile8
/ home / files / profile9

我想排序为

/ 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 / files / profile9
/ home / files / profile10
/ home / files / profile11
/ home / files / profile12
/ home / files / profile14
/ home / files / profile15
/ home / files / profile16

bash脚本有什么好方法吗?我不能在这里使用ruby或python脚本。


尝试使用“ sort
-nd

1
@bobah,“排序:选项`-dn'不兼容”
maxschlepzig 2012年

10
sort -V会做。
2012年

2
@雷神。您的评论将是一个不错的答案
Peter.O 2012年

Answers:


21

您可以使用临时标记来分隔数字:

$ sed 's/\([0-9]\)/;\1/' log | sort -n -t\; -k2,2 | tr -d ';'

在这里,前哨字符为“;” -它不能是要排序的任何文件名的一部分-但可以交换';' 与您喜欢的任何角色。你必须改变sedsorttr相应然后一部分。

管道的工作方式如下:该sed命令将前哨插入任何数字之前,该sort命令将前哨解释为字段定界符,将第二个字段排序为数字排序键,并且该tr命令将再次删除前哨。

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


我喜欢您解决问题的方式:)
SHW 2012年

44

这与这个问题非常相似。问题在于您有一个要排序的字母数字字段,并且-n没有理智地对待它,但是版本sort(-V)却可以。因此使用:

sort -V

请注意,GNU,FreeBSD和OpenBSD排序实现当前支持此功能。


你知道这有多便携吗?该选项似乎不是POSIX规范的一部分。
欧内斯特(Arnest A)

@ErnestA:是的,这是GNU排序特定的解决方案。添加了注释。
2015年

@ErnestA:我好像FreeBSD和OpenBSD已经添加了此功能。
2016年

如果数字具有不同的前缀,则不起作用。
但丁

1
对于任何读者:请注意,这是一个大写V!sort -V不要使用sort -v。乍一看很难说。
加布里埃尔·斯台普斯

7

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

sort -k 1.20n

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.