在这里遇到了一些奇怪的事情,
假设我有一个名为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
之前排序,因为0
在2
之前。
这个默认的排序机制并不总是我们想要的——有时我们想要数值比较,也就是说,12
在101
之前,因为12
比101
小。
就像在我们的示例中,我们要比较数值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练习:那么比较负数呢?或者比较带有加号的数字?或者用逗号代替千位来比较数字?或从不同的地区比较数字字符集?