Eu tenho arquivos potencialmente grandes que precisam ser classificados por chaves 1-n. Algumas dessas teclas podem ser numéricas e outras não. Este é um arquivo colunar de largura fixa, portanto não há delimitadores.
Existe uma boa maneira de fazer isso com a classificação Unix? Com uma tecla, é tão simples quanto usar '-n'. Eu li a página de manual e procurei no Google brevemente, mas não encontrei um bom exemplo. Como eu realizaria isso?
Nota: Excluí o Perl por causa do potencial de tamanho do arquivo. Seria o último recurso.
Respostas:
Use a
-k
opção (ou--key=POS1[,POS2]
). Pode aparecer várias vezes e cada tecla pode ter opções globais (comon
para classificação numérica)fonte
Tome cuidado, porém:
Se você deseja classificar o arquivo principalmente pelo campo 3 e, secundariamente, pelo campo 2, deseja o seguinte:
Não é isso:
sort -k 3 -k 2 < inputfile
que classifica o arquivo pela cadeia de caracteres desde o início do campo 3 até o final da linha (que é potencialmente exclusivo).fonte
sort -k 3,3nr -k 2,2
-k2
deve ser-k2,2
e uma vírgula à direita-k2,
deve ser 'fim de linha mágico padrão ou o que for'.A opção -k é o que você deseja.
Usaria as posições de caracteres 4-5 no primeiro campo (é um campo para largura fixa) e classificaria numericamente como a primeira tecla.
A segunda chave seria os caracteres 14-15 no primeiro campo também.
(editar)
Exemplo (tudo o que tenho é DOS / cygwin à mão):
para os dados:
Classifica a listagem do diretório pelo número do mês (pos 4-5) numericamente e depois pelo nome do arquivo (pos 40-60) ao contrário. Como não há guias, é todo o campo 1 para classificar.
fonte
Aqui está um para classificar várias colunas em um arquivo csv por ordem numérica e de dicionário, colunas 5 e depois como ordem de dicionário
Observe que -k1,1n significa numérico, começando na coluna 1 e terminando na coluna 1. Se eu tivesse feito abaixo, teria concatenado as colunas 1 e 2, tornando 1,10 classificado como 110
fonte
Eu acredito no seu caso, algo como
vai funcionar melhor. @ é o separador de campos, verifique se é um caractere que não aparece em lugar nenhum. sua entrada é considerada como consistindo em uma coluna.
Edit: aparentemente Clintp já deu uma resposta semelhante, desculpe. Como ele aponta, as bandeiras 'n' e 'r' podem ser adicionadas a todas as opções -k ....
fonte
Observe que também pode ser desejado estabilizar a classificação com o
-s
comutador, para que as linhas igualmente classificadas também mantenham sua ordem relativa original na saída.fonte
Eu só quero adicionar algumas dicas, ao usar a classificação, tenha cuidado com o local que afeta a ordem da comparação de chaves. Eu normalmente uso explicitamente LC_ALL = C para tornar o local o que eu quero.
fonte