2013-06-12 41 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