Bash,问题排序数组字符串的后缀



在这里遇到了一些奇怪的事情,

假设我有一个名为Names的字符串数组变量,比如

_billy_2 _bobby_1 _william_3

我想命令他们降数值,

我是这样做的:

sortNames=($( printf '%sn' "${names[@]}" | sort -k3 -t'_' -r))

运行良好

但是,如果我有一个数组,如:
_billy_115 _bobby_3 _william_4

这将打印出:

_william_4 _bobby_3 _billy_115

而不是:

_billy_115 _william_4 _bobby_3

知道为什么吗?或者解决这个问题的好方法是什么?干杯!

让我们减少输入,在file

中只包含以下内容
115
3
4

当我们在这个文件上运行sort -r file(-r反向排序)时,我们得到

bash$ sort -r file
4
3
115

然而,我们正期待

115
4
3

为什么会这样?

sort默认执行字符排序顺序。意思是,它在行与行之间比较第一个字符,然后是第二个字符,然后是第三个字符……
例如,101将在12之前排序,因为02之前。

这个默认的排序机制并不总是我们想要的——有时我们想要数值比较,也就是说,12101之前,因为12101小。

就像在我们的示例中,我们要比较数值3,4,115数字。

为了进行数值比较,GNU sort提供了相当多的指令,一些如下:

-g, --general-numeric-sort
compare according to general numerical value
-n, --numeric-sort
compare according to string numerical value

-g为浮点比较,-n为整型比较。浮点比较比整数比较慢。

为了获得我们期望的排序顺序(反向数字顺序),我们可以使用-r-n指令运行排序,如下所示,这将给出我们想要的顺序:

bash$ sort -r -n file
115
4
3

要应用到原始命令,它看起来像这样

sortNames=($( printf '%sn' "${names[@]}" | sort -k3 -t'_' -r -n ))

应该给

_billy_115 _william_4 _bobby_3
参考https://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html

练习:那么比较负数呢?或者比较带有加号的数字?或者用逗号代替千位来比较数字?或从不同的地区比较数字字符集?

最新更新