Seu arquivo usa formato de largura fixa, então você sempre quer começar a classificar na posição 21.
O comando SORT
fornece uma opção para executar cada comparação de linha, começando em uma determinada posição na linha. A única falha é que não fornece um mecanismo para manter o registro de cabeçalho no topo.
Então o truque é usar SET /P
para ler a primeira linha e escrevê-la em um novo arquivo. Em seguida, use MORE +1
para ler todos, exceto a primeira linha, e canalize isso para SORT \+21
e anexe o resultado ao novo arquivo. A última coisa a fazer é sobrescrever o arquivo original com o novo arquivo com MOVE
.
@echo off
setlocal enableDelayedExpansion
set "file=test.txt"
set /p "ln=" < "%file%"
>"%file%.new" (
echo(!ln!
more +1 "%file%" | sort /+21
)
move /y "%file%.new" "%file%" >nul
Existem limitações para esta estratégia:
- MAIS será interrompido se o arquivo exceder 64k linhas
- MAIS converte guias em espaços
- A linha de cabeçalho não deve exceder 1021 caracteres devido às limitações de SET / P.
Em alternativa, pode utilizar o meu utilitário JSORT.BAT de forma fácil e eficiente execute o tipo com um comando simples. O MOVE ainda é necessário.
@echo off
call test.txt /p 21 /s 1 /o test.txt.new
move /y test.txt.new test.txt >nul
O JSORT é um script puro (JScript / batch híbrido) que é executado nativamente em qualquer máquina Windows do XP em diante. Nenhum arquivo exe de terceiros é necessário.
Observe que o JSORT usa como padrão uma pesquisa sensível a maiúsculas e minúsculas, ao contrário do comando SORT incorporado. Não é um problema com o texto de exemplo, mas se você quiser ignorar o caso, basta anexar a opção /I
.
O JSORT tem uma limitação de tamanho devido ao fato de que o arquivo inteiro deve caber em uma única variável de cadeia na memória. Não tenho certeza sobre o valor exato, mas acredito que o tamanho máximo de arquivo suportado seja um pouco inferior a 1 GB.
Leia a ajuda incorporada para aprender sobre outros recursos interessantes que o JSORT suporta.
- Classifique os números incorporados como números em vez de texto
- Classifique com base em um token delimitado em vez de em uma posição fixa
- Preserve somente linhas exclusivas
- Limite o número de linhas de saída