在 Bash 中使用数字对字符串排序

我经常想对包含数字的字符串进行排序,这样在排序例如 abc_2, abc_1, abc_10时,结果就是 abc_1, abc_2, abc_10。我见过的每一种排序机制都被归类为 abc_1, abc_10, abc_2,即从左边开始逐个字符排序。

有什么有效的排序方法可以得到我想要的结果吗?查看每个字符,确定它是否是数字,从后续的数字中构建子字符串并将其作为数字进行排序,这种想法在 bash中实在是太可怕了,无法想象。

是否没有络腮胡 * nix 大师实现了带有 --sensible_numerical选项的 sort替代版本?

75120 次浏览

Execute this

sort -t _ -k 2 -g data.file
  • -t separator
  • -k key/column
  • -g general numeric sort

I think this is a GNU extension to sort, but you're looking for the --version-sort (or -V) option:

$ printf "prefix%d\n" $(seq 10 -3 1)
prefix10
prefix7
prefix4
prefix1


$ printf "prefix%d\n" $(seq 10 -3 1) | sort
prefix1
prefix10
prefix4
prefix7


$ printf "prefix%d\n" $(seq 10 -3 1) | sort --version-sort
prefix1
prefix4
prefix7
prefix10

https://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html

You can sort using version-sort
Just pass the following arg -V or --version-sort

# without (ersion-sort)
$ cat a.txt
abc_1
abc_4
abc_2
abc_10
abc_5


# with (version-sort)
$ sort -V a.txt
abc_1
abc_2
abc_4
abc_5
abc_10