Eu tenho um arquivo de duas colunas; o arquivo já está classificado da maneira que eu quero na coluna 1. Eu gostaria de classificar na coluna 2, dentro de cada categoria da coluna 1. No entanto, sort
não entende a ordem de classificação da coluna 1.
A maneira normal (de perguntas semelhantes aqui na pilha) seria esta:
sort --stable -k1,1 -k2,2n
Mas não posso especificar a classificação em k1, porque é arbitrário.
Exemplo de entrada:
C 2
C 1
A 2
A 1
B 2
B 1
e saída:
C 1
C 2
A 1
A 2
B 1
B 2
Você pode usar awk para iniciar uma nova classificação para cada bloco:
$1 != prev {close(cmd); prev=$1}
- quando o valor salvo é diferente, temos um novo bloco, então fechamos qualquer iniciado anteriormentesort
{print | "sort -k2,2"}'
canaliza a saída parasort
, iniciando-a se ainda não estiver em execução (o awk pode acompanhar os comandos que inicia)Você poderia usar uma transformação Schwartziana (esta é basicamente a abordagem decorar-classificar-desdecorar que você mencionou em um comentário, mas provavelmente mais eficiente do que a de muru eficiente do que a boa resposta devido ao uso de uma única
sort
invocação em oposição a várias) - usandoawk
adicione uma coluna de prefixo que incrementa com uma mudança de valor na primeira coluna, ordenar pela coluna de prefixo seguida pela coluna "segunda" (cuja posição ordinal mudou temporariamente3
devido à presença da coluna de prefixo) e, finalmente, se livrar da coluna de prefixo