我经常想要对包含数字的字符串进行排序,以便在排序时abc_2, abc_1, abc_10
结果为abc_1, abc_2, abc_10
。我看到的每种排序机制都排序为abc_1, abc_10, abc_2
,这是左边的字符。
有没有有效的方法来排序以获得我想要的结果?查看每个字符,确定它是否为数字,从后续数字中构建子字符串并将其作为数字排序的想法在bash
中过于令人震惊,无法考虑。
没有胡须* nix guru使用sort
选项实现了--sensible_numerical
的替代版本?
答案 0 :(得分:102)
执行此
sort -t _ -k 2 -g data.file
答案 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