在Bash中对带有数字的字符串进行排序

79

我经常想对字符串中的数字进行排序,使得例如 abc_2, abc_1, abc_10 排序后为 abc_1, abc_2, abc_10。我见过的每一种排序机制都是按照从左到右逐个字符排序的方式,即结果为 abc_1, abc_10, abc_2

有没有一种高效的方法来获得我想要的排序结果?在 bash 中查看每个字符,确定它是否是数字,构建一个由连续数字组成的子字符串,并将其作为数字排序,这个想法让人无法忍受。

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


你的前缀总是一样的吗? - Roman Newaza
3个回答

141

执行此操作

sort -t _ -k 2 -g data.file
  • -t 分隔符
  • -k 键/列
  • -g 通用数字排序

2
他需要按数字排序 - 这是第二个字段:printf“abc_2 \ nabc_1 \ nabc_10 \ n”| sort -t _ -k 2 -g - Roman Newaza
@RomanNewaza,谢谢!你知道,零也是一个数字。 :-) - Grzegorz Żur
1
这不是以零为基础的。请查看手册页。 - Roman Newaza

55

我认为这是GNU的sort扩展,但您要查找的是--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


哎呀,我正在开发的 RHEL 版本上,sort 的老年版本上还没有实现这个选项。 - hardcode57
4
“sort -V” 对我来说很有效。 - nurettin
"sort -V" 对我也起作用了,你使用的是哪个版本的RHEL? - Max Cuttins
这正是我一直在寻找的。 - Julian Paolo Dayag

47
您可以使用版本排序进行排序
只需传递以下参数-V--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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接