一尘不染

在一行的最后一个字段上排序

linux

对行列表进行排序(在每行的最后一个字段上排序)的最简单方法是什么?每行可能具有可变数量的字段。

就像是

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

我希望此列表按文件名排序,所有文件名均以数字开头,该数字指示应读取文件的顺序。

我在下面添加了我的答案,这是我目前的做法。我曾希望有一种更简单的方法-也许是另一种排序实用程序-也许不需要操纵数据。


阅读 239

收藏
2020-06-03

共1个答案

一尘不染

这是一个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
2020-06-03