2013-06-12 40 views
39

我经常想用字符串排序数字,这样当排序时abc_2, abc_1, abc_10结果是abc_1, abc_2, abc_10。我见过的每种排序机制都排序为abc_1, abc_10, abc_2,即从左侧开始逐个字符。bash:用数字排序字符串

有没有任何有效的方法来获得我想要的结果?查看每个角色,确定它是否是一个数字,从随后的数字中构建一个子串并将其作为一个数字进行排序的想法,在bash中考虑得太过分了。

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

+0

是您的前缀始终是相同的? –

回答

75

执行此

sort -t _ -k 2 -g data.file 
  • -t分离
  • -k键/列
  • -g一般数字排序
+1

他需要按编号排序 - 它是第二个字段:'printf“abc_2 \ nabc_1 \ nabc_10 \ n”| sort -t _ -k 2 -g' –

+0

@RomanNewaza,谢谢!你知道,零也是一个数字。 :-) –

+1

这不是基于零的。看看手册页。 –

21

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

+0

唉,这个选项还没有在我正在开发的老版本的RHEL版本上老化版本上实现。 – hardcode57

+0

“sort -V”对我来说效果很好。 – nurettin

+0

“sort -V”也适用于我,您正在使用哪个版本的RHEL? –

18

试试这个

$ 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