web-dev-qa-db-ja.com

Bashで数字を使用して文字列を並べ替える

私はしばしば、数字を含む文字列を並べ替えたいと思っていました。 abc_2, abc_1, abc_10結果はabc_1, abc_2, abc_10です。私が見たすべてのソートメカニズムは、abc_1, abc_10, abc_2としてソートされます。これは、左から1文字ずつです。

私が望む結果を得るためにソートする効率的な方法はありますか?すべての文字を見て、数字かどうかを判断し、後続の数字から部分文字列を構築し、数字としてソートするというアイデアは、bashで考えるにはあまりにも恐ろしいです。

あごひげを生やしていない* nix達人は--sensible_numericalオプションでsortの代替バージョンを実装しましたか?

54
hardcode57

これを実行する

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

これは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

36
glenn jackman

これを試して

$ 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
26
Bill