Classificando em ordem numérica reversa no subcampo em uma ordenação de vários campos

2

Estou tentando usar o tipo GNU em uma lista de diretórios / arquivos, por exemplo (subconjunto de listas muito mais longas):

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

Eu já estou classificando isso com sucesso no nome do arquivo (quarto campo) seguido da temporada (3º campo), por exemplo

$ 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

Mas para cada bloco como este, eu preciso deles na ordem decrescente do ano como o terceiro critério de classificação, usando os quatro dígitos da posição 6 a 9 do primeiro campo. Se eu usar:

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

que parece funcionar, mas não classifica esse terceiro critério em ordem numérica reversa:

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

Estou claramente fazendo algo errado aqui, mas questões relacionadas não abordam essa condição específica (terceiro critério de classificação, subcampo, numérico, reverso) e não consigo identificar o motivo pelo qual ele falha.

    
por Peter Flynn 10.06.2015 / 12:01

1 resposta

3

Para ter certeza de que adicionei uma nova linha nos dados do exemplo:

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

Eu adicionei que para ilustrar que a classificação também depende do quarto campo. Tem o mesmo ano e o mesmo 3º campo, mas diferente 4º campo. Se entendi corretamente, isso deve fazer o que você quer.

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

Saída:

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

Primeiro, classifique o terceiro campo ( -k3,3 ), depois o primeiro campo de caractere 6-9 deve ser inverso e numérico ( -k1.6nr,1.9 ) e, finalmente, o quarto campo ( -k4 ).

    
por 10.06.2015 / 12:27