Windows CLI: classificar arquivo de texto por coluna

0

Gostaria de classificar um arquivo de texto pela terceira coluna de dados, não pelo terceiro caractere, usando comandos CLI simples do Windows. Os comandos seriam colocados em um arquivo de lote.

Os dados seriam parecidos com

#filename   seqno   phasename   a       b       c       scale   Rwp
blah_001.xye    1   corundum    3       3       12      0.001   3
blah_001.xye    1   silicon     5.4     5.4     5.4     0.002   3
blah_002.xye    2   corundum    3.1     3.1     12.1    0.002   3.5
blah_002.xye    2   silicon     5.41    5.41    5.41    0.004   3.5
blah_003.xye    3   corundum    3.2     3.2     12.2    0.001   3.1
blah_003.xye    3   silicon     5.42    5.42    5.42    0.002   3.1
blah_004.xye    4   corundum    3.4     3.4     12.2    0.001   3.2
blah_004.xye    4   silicon     5.43    5.43    5.43    0.002   3.2
blah_005.xye    5   corundum    3.5     3.5     12.3    0.001   3.9
blah_005.xye    5   silicon     5.44    5.44    5.44    0.002   3.9
blah_006.xye    6   corundum    3.6     3.6     12.3    0.001   3.1
blah_006.xye    6   silicon     5.45    5.45    5.45    0.002   3.1

Eu quero classificar por nome de fase. Se seria bom se eu pudesse manter a primeira linha no lugar. Haverá mais de 5 colunas após a 3ª, e haverá mais linhas do que isso, mas a classificação será sempre pela terceira coluna.

Eu vi esta pergunta , mas não posso decifrar os comandos for.

    
por masher 01.08.2018 / 15:21

1 resposta

0

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
por 01.08.2018 / 20:42