連続した数字を単一の数字で並べ替える

連続した数字を単一の数字で並べ替える

コマンド出力は次のとおりです。

file_0
file_1
file_10
file_11
file_12
file_13
file_14
file_15
file_2
file_3
file_4
file_5
file_6
file_7
file_8
file_9

awkまたは他のposixツールを使用して、連続した数字を単一の数字に実際に並べ替える方法:

file_0
file_1
file_2
file_3
file_4
file_5
file_6
file_7
file_8
file_9
file_10
file_11
file_12
file_13
file_14
file_15

通常、数値がファイル名内にある場合にも機能します。たとえば、次のようになります。

file_0.txt
file_1.txt
file_10.txt
file_11.txt
file_12.txt
file_13.txt
file_14.txt
file_15.txt
file_2.txt
file_3.txt
file_4.txt
file_5.txt
file_6.txt
file_7.txt
file_8.txt
file_9.txt

答え1

sort -nt '_' -k2 

出力:

file_0
file_1
file_2
file_3
file_4
file_5
file_6
file_7
file_8
file_9
file_10
file_11
file_12
file_13
file_14
file_15

または:

file_0.txt
file_1.txt
file_2.txt
file_3.txt
file_4.txt
file_5.txt
file_6.txt
file_7.txt
file_8.txt
file_9.txt
file_10.txt
file_11.txt
file_12.txt
file_13.txt
file_14.txt
file_15.txt

FreeBSDとGNUのcoreutils実装でテストされていますが、実装では機能しませsortん。busybox使用されるすべてのオプションは次のように指定されます。 POSIX

答え2

これを試してみてください:

output | awk '{print gensub("[^0-9]*","","g")  " " $0 }' | sort -n | awk '{$1=""; print $0}' | sed 's/^ //g'

最もエレガントなソリューションではありませんが、動作します。

答え3

答えは(そのうちの1つであると確信しています):

sort -t _ -k 2 -g [filename with names+numbers or piped from another command with | - both situations will work ]

関連情報