72

我经常想对带有数字的字符串进行排序,以便在排序时例如 abc_2, abc_1, abc_10结果为abc_1, abc_2, abc_10. 我见过的每种排序机制都排序为abc_1, abc_10, abc_2,即从左到右逐个字符。

有没有什么有效的方法来排序以获得我想要的结果?查看每个字符,确定它是否是数字,从后续数字中构建一个子字符串并将其作为数字排序的想法太可怕了,无法在bash.

没有大胡子 *nix 大师实现了sort一个--sensible_numerical选项的替代版本吗?

4

3 回答 3

131

执行这个

sort -t _ -k 2 -g data.file
  • -t 分隔符
  • -k 键/列
  • -g 通用数字排序
于 2013-06-12T09:30:28.770 回答
49

我认为这是 GNU 扩展sort,但您正在寻找--version-sort(or -V) 选项:

$ 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

于 2013-06-12T10:06:49.950 回答
41

尝试这个

$ cat a.txt
abc_1
abc_4
abc_2
abc_10
abc_5

$ sort -V a.txt
abc_1
abc_2
abc_4
abc_5
abc_10
于 2013-06-12T11:38:33.147 回答