按连续数字作为单个数字排序

按连续数字作为单个数字排序

命令输出如下:

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

答案(我确信其中之一)是:

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

相关内容