在多字段排序中按子字段的相反数字顺序排序

在多字段排序中按子字段的相反数字顺序排序

我正在尝试对目录/文件列表使用 GNU 排序,例如(更长列表的子集):

exams2008/Zoology/Summer/ZY4019Sum08.pdf
exams2009/Zoology/Summer/ZY4019.pdf
exams2010/Zoology/Summer/ZY4019Sum2010.pdf
exams2011/Zoology/Summer/ZY4019Sum2011.pdf
exams2012/Zoology/Autumn/ZY4019Aut2012.pdf
exams2012/Zoology/Summer/ZY4019Sum2012.pdf
exams2013/Zoology/Autumn/ZY4019Aut2013.pdf
exams2013/Zoology/Summer/ZY4019Sum2013.pdf
exams2014/Zoology/Summer/ZY4019Sum2014.pdf

我已经成功地对文件名(第四个字段)进行了排序,然后是季节(第三个字段),例如

$ sort -t/ -k4 -k3,3 
exams2012/Zoology/Autumn/ZY4019Aut2012.pdf
exams2013/Zoology/Autumn/ZY4019Aut2013.pdf
exams2009/Zoology/Summer/ZY4019.pdf
exams2008/Zoology/Summer/ZY4019Sum08.pdf
exams2010/Zoology/Summer/ZY4019Sum2010.pdf
exams2011/Zoology/Summer/ZY4019Sum2011.pdf
exams2012/Zoology/Summer/ZY4019Sum2012.pdf
exams2013/Zoology/Summer/ZY4019Sum2013.pdf
exams2014/Zoology/Summer/ZY4019Sum2014.pdf

但对于像这样的每个块,我需要它们按年份降序排列作为第三个排序标准,使用第一个字段的位置 6 到 9 的四位数字。如果我使用:

sort -t/ -k4 -k3,3 -k1.6nr,1.9 

看起来好像应该可以工作,但它不会按相反的数字顺序对第三个标准进行排序:

exams2012/Zoology/Autumn/ZY4019Aut2012.pdf
exams2013/Zoology/Autumn/ZY4019Aut2013.pdf
exams2009/Zoology/Summer/ZY4019.pdf
exams2008/Zoology/Summer/ZY4019Sum08.pdf
exams2010/Zoology/Summer/ZY4019Sum2010.pdf
exams2011/Zoology/Summer/ZY4019Sum2011.pdf
exams2012/Zoology/Summer/ZY4019Sum2012.pdf
exams2013/Zoology/Summer/ZY4019Sum2013.pdf
exams2014/Zoology/Summer/ZY4019Sum2014.pdf

我显然在这里做错了什么,但相关问题没有解决这个特定条件(第三个排序标准、子字段、数字、反向),而且我无法确定它失败的原因。

答案1

为了确保我在示例数据中添加了新行:

exams2008/Zoology/Summer/ZY4019Sum08.pdf
exams2009/Zoology/Summer/ZY4019.pdf
exams2010/Zoology/Summer/ZY4019Sum2010.pdf
exams2011/Zoology/Summer/ZY4019Sum2011.pdf
exams2012/Zoology/Autumn/ZY4019Aut2012.pdf
exams2012/Zoology/Summer/ZY4019Sum2012.pdf
exams2013/Zoology/Autumn/ZY4019Aut2013.pdf
exams2013/Zoology/Summer/ZY4019Sum2013.pdf
exams2014/Zoology/Summer/ZY4019Sum2014.pdf
exams2014/Zoology/Summer/ZY4029Sum2014.pdf <- This is added by me

我添加它是为了说明排序也取决于第四个字段。它具有相同的年份和相同的第 3 字段,但第 4 字段不同。如果我理解正确的话,那应该做你想要的。

sort -t/ -k3,3 -k1.6nr,1.9 -k4 file

输出:

exams2013/Zoology/Autumn/ZY4019Aut2013.pdf
exams2012/Zoology/Autumn/ZY4019Aut2012.pdf
exams2014/Zoology/Summer/ZY4019Sum2014.pdf
exams2014/Zoology/Summer/ZY4029Sum2014.pdf
exams2013/Zoology/Summer/ZY4019Sum2013.pdf
exams2012/Zoology/Summer/ZY4019Sum2012.pdf
exams2011/Zoology/Summer/ZY4019Sum2011.pdf
exams2010/Zoology/Summer/ZY4019Sum2010.pdf
exams2009/Zoology/Summer/ZY4019.pdf
exams2008/Zoology/Summer/ZY4019Sum08.pdf

首先对第三个字段 ( -k3,3) 进行排序,然后第一个字段的字符 6-9 应该是反向的数字 ( -k1.6nr,1.9),最后对第四个字段 ( -k4) 进行排序。

相关内容