我有一个文件列表,例如:
100119329_d01.png
100119329_d08.png
100119329_d02.png
100119329_d05.png
100119329_d03.png
100119329_d04.png
100119329_d07.png
100119329_f02.png
100119329_f01.png
我想按数字排序,然后按前一个字符反向排序以获得以下输出:
100119329_f01.png
100119329_f02.png
100119329_d01.png
100119329_d02.png
100119329_d03.png
100119329_d04.png
100119329_d05.png
100119329_d07.png
100119329_d08.png
我试过了:
cat <file> |sort -k1.11r -k1.12,1.13n
但一次只有一个论点有效。所以我只能按数字或反转字符排序。我怎样才能让两者同时工作?
答案1
仅对第 11 个字符进行反向排序,例如
sort -k1.11,1.11r -k1.12,1.13n infile
虽然在这种情况下(数字用零填充)你可以简单地运行
sort -k1.11,1.11r infile
答案2
如果目标是随后使用 zsh 按该顺序处理这些文件,则可以使用 glob 限定符完成排序:
$ print -rC1 -- *_?[0-9][0-9].png(Oe['REPLY=$REPLY[-7]$((200-REPLY[-6,-5]))'])
100119329_f01.png
100119329_f02.png
100119329_d01.png
100119329_d02.png
100119329_d03.png
100119329_d04.png
100119329_d05.png
100119329_d07.png
100119329_d08.png
我们是否根据某些将排序键定义为的代码的评估O
结果进行反向排序(大写)e
信已关注 200 -号码。所以 的关键100119329_f01.png
是f199
, 的关键100119329_a99.png
是a101
。
要对这些文件执行其他操作:
for file ( *_?[0-9][0-9].png(Oe['REPLY=$REPLY[-7]$((200-REPLY[-6,-5]))']) )
anything-else-with -- $file
例如。