我有一个文件列表,其中包含我需要排序的版本号
/this/is/a/file/path/product-2.0/file/name/7
/this/is/a/file/path/product-2.0/file/name/10
/this/is/a/file/path/product-2.0/file/name/12
/this/is/a/file/path/product-2.0/file/name/13
/this/is/a/file/path/product-2.0/file/name/6
/this/is/a/file/path/product-2.0/file/name/8
/this/is/a/file/path/product-2.0/file/name/9
当我通过grep管道时,它就像这样:
echo $files | sort -n
/this/is/a/file/path/product-2.0/file/name/10
/this/is/a/file/path/product-2.0/file/name/12
/this/is/a/file/path/product-2.0/file/name/13
/this/is/a/file/path/product-2.0/file/name/6
/this/is/a/file/path/product-2.0/file/name/7
/this/is/a/file/path/product-2.0/file/name/8
/this/is/a/file/path/product-2.0/file/name/9
我认为-n被文件名中的第一个数字搞糊涂了。
如何用最后一个数字
对数字进行排序答案 0 :(得分:15)
Kaizen ~/so_test $ cat ztestfile1 | sort -t'/' -n -k10
/this/is/a/file/path/product-2.0/file/name/6
/this/is/a/file/path/product-2.0/file/name/7
/this/is/a/file/path/product-2.0/file/name/8
/this/is/a/file/path/product-2.0/file/name/9
/this/is/a/file/path/product-2.0/file/name/10
/this/is/a/file/path/product-2.0/file/name/12
/this/is/a/file/path/product-2.0/file/name/13
这有帮助吗?
替代方式,即独立于职位.....
Kaizen ~/so_test $ cat ztestfile1 | sort -V
/this/is/a/file/path/product-2.0/file/name/6
/this/is/a/file/path/product-2.0/file/name/7
/this/is/a/file/path/product-2.0/file/name/8
/this/is/a/file/path/product-2.0/file/name/9
/this/is/a/file/path/product-2.0/file/name/10
/this/is/a/file/path/product-2.0/file/name/12
/this/is/a/file/path/product-2.0/file/name/13
请注意其排序中的-V(Capital)选项,该选项查看字符串中的数字差异以进行排序.....与版本号一样。
手册页文字::
-V, --version-sort
natural sort of (version) numbers within text
答案 1 :(得分:3)
您可以使用/
作为列分隔符:
sort -n -t/ -k 10
答案 2 :(得分:3)
使用awk
将最后一个字段置于第1个字段前面sort
,然后应用cut
删除第一个字段。使用下面的here document
awk -F'/' '{print($NF"/"$0)}' <<! | sort -k1n,1n -t'/' | cut -f2- -d'/'
> /this/is/a/file/path/product-2.0/file/name/7
> /this/is/a/file/path/product-2.0/file/name/10
> /this/is/a/file/path/product-2.0/file/name/12
> /this/is/a/file/path/product-2.0/file/name/13
> /this/is/a/file/path/product-2.0/file/name/6
> /this/is/a/file/path/product-2.0/file/name/8
> /this/is/a/file/path/product-2.0/file/name/9
> !
/this/is/a/file/path/product-2.0/file/name/6
/this/is/a/file/path/product-2.0/file/name/7
/this/is/a/file/path/product-2.0/file/name/8
/this/is/a/file/path/product-2.0/file/name/9
/this/is/a/file/path/product-2.0/file/name/10
/this/is/a/file/path/product-2.0/file/name/12
/this/is/a/file/path/product-2.0/file/name/13
答案 3 :(得分:1)
或使用像perl或ruby这样的单线:
ruby -we 'print *readlines.sort_by{|x| File.basename(x).to_i}'
答案 4 :(得分:0)
通过使用/
作为字段分隔符,使用最后一个值并将其放在行的开头,排序,然后从开头删除值,可以按路径中的最后一项对其进行排序这条线。
cat data | awk 'BEGIN { FS="/"} { print $(NF) " " $0 }' | sort -n | sed 's/^.*\s//g'