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

cam*_*amh 35 linux sorting shell

排序行列表的最简单方法是什么,对每行的最后一个字段进行排序?每行可以具有可变数量的字段.

就像是

sort -k -1
Run Code Online (Sandbox Code Playgroud)

是我想要的,但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
Run Code Online (Sandbox Code Playgroud)

我希望这个列表按文件名排序,所有这些都以数字开头,表示文件的读取顺序.

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

小智 13

awk '{print $NF,$0}' file | sort | cut -f2- -d' '
Run Code Online (Sandbox Code Playgroud)

基本上,这个命令可以:

  1. 重复开头的最后一个字段,用空格分隔(默认OFS)
  2. 使用完整路径($ 0)排序,解析重复的文件名以进行排序
  3. 剪切重复的第一个字段,f2-表示从第二个字段到最后一个字段


Gab*_*abe 12

这是一个Perl命令行(请注意,您的shell可能要求您转义$s):

perl -e "print sort {(split '/', $a)[-1] <=> (split '/', $b)[-1]} <>"
Run Code Online (Sandbox Code Playgroud)

只需将列表输入其中,或者如果列表位于文件中,则将文件名放在命令行的末尾.

请注意,此脚本实际上不会更改数据,因此您不必小心使用的分隔符.

这是示例输出:

>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

  • 我更喜欢反转引号以避免shell扩展,例如`perl -e'print sort {(split"/",$ a)[ - 1] <=>(split"/",$ b)[ - 1]} <>'filename` (4认同)
  • 我收回那句话 - 它对我不起作用(perl v5.10.1)。我在问题中剪切并粘贴了您的行和我的数据,因此没有拼写错误。 (2认同)

gho*_*g74 7

这样的事情

awk '{print $NF"|"$0}' file | sort -t"|" -k1 | awk -F"|" '{print $NF }'
Run Code Online (Sandbox Code Playgroud)