2013-06-12 12 views
39

私はしばしば、数値で文字列を並べ替えたいと思っていました。 abc_2, abc_1, abc_10結果はabc_1, abc_2, abc_10です。私がソートしたすべてのソートメカニズムは、左から1文字分のabc_1, abc_10, abc_2というように分類されています。bash:数値で文字列を並べ替える

私が望む結果を得るために効率的なソート方法はありますか?すべての文字を見て、それが数字かどうかを判断し、後続の数字から部分文字列を作成し、数値として並べ替えるという考え方は、あまりにも控えめで、bashに熟考してください。

bearded * nix guruさんはsortの代替バージョンを--sensible_numericalオプションで実装していませんか?

+0

は、あなたの接頭辞は常に同じです試してみてください? –

答えて

75

は、私はこれがsortにGNUの拡張であると考え、この

sort -t _ -k 2 -g data.file 
  • -tセパレーター
  • -kキー/列
  • -g一般的な数値ソート
+1

番号でソートする必要があります。これは2番目のフィールドです: 'printf" abc_2 \ nabc_1 \ nabc_10 \ n "| sort -t _ -k 2 -g' –

+0

@RomanNewaza、ありがとう!あなたも知っています、ゼロも数字です。 :-) –

+1

これはゼロベースではありません。マニュアルページを見てください。 –

21

を実行します--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の高齢者向けバージョンのsort avilableの古いバージョンでは実装されていません。 – 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