对行列表进行排序(在每行的最后一个字段上排序)的最简单方法是什么?每行可能具有可变数量的字段。
就像是
sort -k -1
是我想要的,但是sort(1)不需要负数来从末尾而不是从开始选择字段。
我也希望能够选择字段分隔符。
编辑:为问题添加一些特殊性:我要排序的列表是路径名列表。路径名可以是任意深度,因此字段数是可变的。我想对文件名组件进行排序。
此附加信息可能会更改操作行以提取最后一个字段的方式(可以使用basename(1)),但不会更改排序要求。
例如
/a/b/c/10-foo /a/b/c/20-bar /a/b/c/50-baz /a/d/30-bob /a/e/f/g/h/01-do-this-first /a/e/f/g/h/99-local
我希望此列表按文件名排序,所有文件名均以数字开头,该数字指示应读取文件的顺序。
我在下面添加了我的答案,这是我目前的做法。我曾希望有一种更简单的方法-也许是另一种排序实用程序-也许不需要操纵数据。
这是一个Perl命令行(请注意,您的shell可能需要您对$s 进行转义):
perl -e "print sort {(split '/', $a)[-1] <=> (split '/', $b)[-1]} <>"
只需将列表通过管道传送到其中,或者如果列表在文件中,则将文件名放在命令行末尾。
请注意,此脚本实际上并不会更改数据,因此您不必注意使用的分度数。
这是示例输出:
>perl -e "print sort {(split '/', $a)[-1] <=> (split '/', $b)[-1]} " files.txt /a/e/f/g/h/01-do-this-first /a/b/c/10-foo /a/b/c/20-bar /a/d/30-bob /a/b/c/50-baz /a/e/f/g/h/99-local