在Bash中用数字对字符串进行排序[重复]

Posted

技术标签:

【中文标题】在Bash中用数字对字符串进行排序[重复]【英文标题】:Sorting strings with numbers in Bash [duplicate] 【发布时间】:2013-06-08 08:32:23 【问题描述】:

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

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

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

【问题讨论】:

你的前缀总是一样的吗? 【参考方案1】:

执行这个

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

【讨论】:

他需要按数字排序 - 这是第二个字段:printf "abc_2\nabc_1\nabc_10\n" | sort -t _ -k 2 -g @RomanNewaza,谢谢!你知道,零也是一个数字。 :-) 这不是从零开始的。查看手册页。【参考方案2】:

我认为这是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

【讨论】:

唉,这个选项还没有在我正在开发的 RHEL 的老年版本上可用的老版本排序上实现。 "sort -V" 对我来说效果很好。 "sort -V" 也适用于我,您使用的是哪个版本的 RHEL? 这正是我一直在寻找的。​​span> 【参考方案3】:

试试这个

$ 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

【讨论】:

以上是关于在Bash中用数字对字符串进行排序[重复]的主要内容,如果未能解决你的问题,请参考以下文章

按字符串内的数字对数组进行排序[重复]

python:当它是数字列表时对字符串列表进行排序[重复]

数组列表排序[重复]

排序字符串数字[重复]

聪明的排序(排序可能包含或不包含数字的字符串)[重复]

排序包含字符串和整数的数组列表