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

时间:2013-06-12 09:23:47

标签: bash sorting alphanumeric

我经常想要对包含数字的字符串进行排序,以便在排序时abc_2, abc_1, abc_10结果为abc_1, abc_2, abc_10。我看到的每种排序机制都排序为abc_1, abc_10, abc_2,这是左边的字符。

有没有有效的方法来排序以获得我想要的结果?查看每个字符,确定它是否为数字,从后续数字中构建子字符串并将其作为数字排序的想法在bash中过于令人震惊,无法考虑。

没有胡须* nix guru使用sort选项实现了--sensible_numerical的替代版本?

3 个答案:

答案 0 :(得分:102)

执行此

sort -t _ -k 2 -g data.file
  • -t separator
  • -k key / column
  • -g通用数字排序

答案 1 :(得分:32)

我认为这是sort的GNU扩展,但您正在寻找--version-sort(或-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

答案 2 :(得分:25)

试试这个

$ 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