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)
基本上,这个命令可以:
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
这样的事情
awk '{print $NF"|"$0}' file | sort -t"|" -k1 | awk -F"|" '{print $NF }'
Run Code Online (Sandbox Code Playgroud)