CLI Windows: trier le fichier texte par colonne

1

J'aimerais trier un fichier texte en fonction de la 3ème colonne de données, et non du 3ème caractère, à l'aide de commandes CLI Windows pures. Les commandes seraient placées dans un fichier de commandes.

Les données ressembleraient à quelque chose comme

#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

Je veux trier par phasename. Ce serait bien si je pouvais garder la première rangée en place. Il y aura plus de 5 colonnes après la 3ème et il y aura plus de lignes que cela, mais le tri se fera toujours par la 3ème colonne.

J'ai vu cette question , mais je ne peux pas déchiffrer les commandes for.

pilon
la source
J'attire votre attention sur les informations détaillées disponibles sur SS64 sur la FORcommande , ou sur la propre documentation de Microsoft sur la FORcommande , voire sur la sortie de HELP FOR.
Jeff Zeitlin

Réponses:

2

Votre fichier utilise un format de largeur fixe. Vous souhaitez donc toujours commencer le tri à la position 21.

La SORTcommande fournit une option pour effectuer chaque comparaison de ligne en commençant à une position particulière de la ligne. Le seul inconvénient est qu'il ne fournit pas de mécanisme pour conserver l'enregistrement d'en-tête en haut.

L'astuce consiste donc à utiliser SET /Ppour lire la première ligne et l'écrire dans un nouveau fichier. Utilisez ensuite MORE +1pour lire tout sauf la 1ère ligne, puis dirigez-le vers SORT \+21et ajoutez le résultat au nouveau fichier. La dernière chose à faire est d'écraser le fichier d'origine avec le nouveau fichier 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

Il y a des limites à cette stratégie:

  • MORE se bloque si le fichier dépasse 64 000 lignes
  • MORE convertit les onglets en espaces
  • La ligne d'en-tête ne doit pas dépasser 1021 caractères en raison des limitations de SET / P.

Sinon, vous pouvez utiliser mon utilitaire JSORT.BAT pour effectuer facilement et efficacement le tri à l'aide d'une commande simple. Le MOVE est toujours requis.

@echo off
call test.txt /p 21 /s 1 /o test.txt.new
move /y test.txt.new test.txt >nul

JSORT est un script pur (hybride JScript / batch) qui s'exécute de manière native sur toute machine Windows à partir de XP. Aucun fichier exe tiers n'est nécessaire.

Notez que JSORT utilise par défaut une recherche sensible à la casse, contrairement à la commande SORT intégrée. Ce n'est pas un problème avec votre exemple de texte, mais si vous souhaitez ignorer la casse, ajoutez simplement l' /Ioption.

JSORT a une limite de taille en raison du fait que le fichier entier doit tenir dans une seule variable chaîne en mémoire. Je ne suis pas sûr de la valeur exacte, mais je pense que la taille de fichier maximale prise en charge est un peu inférieure à 1 Go.

Lisez l'aide intégrée pour en savoir plus sur d'autres fonctionnalités intéressantes prises en charge par JSORT.

  • Triez les nombres incorporés sous forme de nombres au lieu de texte
  • Trier en fonction d'un jeton délimité au lieu d'une position fixe
  • Ne conserver que des lignes uniques
  • Limiter le nombre de lignes en sortie
Dbenham
la source