bash按字母顺序排序字符串列表

时间:2013-06-05 16:26:39

标签: bash sorting

我有一个文件列表,其中包含我需要排序的版本号

/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被文件名中的第一个数字搞糊涂了。

如何用最后一个数字

对数字进行排序

5 个答案:

答案 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'