Est-il possible de trier entre deux chaînes dans un gros fichier?
Par exemple, le fichier actuel est comme:
0cf Front Brake
0d0 Rear Brake
0ce Handle Bars
HUT 03 VR Controls
009 Vest
001 Belt
002 Body Suit
020 Stereo Enable
003 Flexor
007 Hand Tracker
004 Glove
006 Head Mounted Display
008 Oculometer
00a Animatronic Device
000 Unidentified
021 Display Enable
005 Head Tracker
HUT 04 Sport Controls
000 Unidentified
002 Golf Club
001 Baseball Bat
Et la sortie souhaitée est la suivante:
0ce Handle Bars
0cf Front Brake
0d0 Rear Brake
HUT 03 VR Controls
000 Unidentified
001 Belt
002 Body Suit
003 Flexor
004 Glove
005 Head Tracker
006 Head Mounted Display
007 Hand Tracker
008 Oculometer
009 Vest
00a Animatronic Device
020 Stereo Enable
021 Display Enable
HUT 04 Sport Controls
000 Unidentified
001 Baseball Bat
002 Golf Club
Ici, la section HUT 03 VR Controls et HUT 04 Sports Controls est triée.
Dans un fichier donné, les en-têtes de section commencent par des caractères sans espace tandis que le contenu de la section commence toujours par un espace ou une tabulation. Étant donné que ce fichier contient plus de 100 sections, il ne sera pas possible de coder en dur le nom de la section dans le script / la commande
Réponses:
En Python:
Cela trie toutes les sections (séparément), pas seulement celles entre deux lignes spécifiques.
la source
Pour le plaisir, voici un moyen de trier une seule section en utilisant
ex
:la source
Cela permet
awk
d'ajouter un nombre (et un séparateur de tabulation) devant chaque ligne correspondant à la section dans laquelle se trouve cette ligne. Pour les en-têtes de section, nous ajoutons un nombre suivi d'un caractère de retour arrière (uniquement parce que le retour arrière trie avant les tabulations). Ensuite, nous trions simplement les données résultantes sur ces numéros avant de les supprimer et les séparateurs d'onglets ajoutés.Les en-têtes de section sont détectés en recherchant des caractères non vides au début de la ligne.
la source
HUT
champ) comme préfixe, pour trier également les sections.Vous pourriez obtenir
awk
etsort
coopérer pour faire le travail.sort
close
lesort
lorsqu'un marqueur de section est rencontrée; cela provoquesort
le vidage de sa sortie vers la sortie standard et la sortiesort
prend le relais des lignes de contenu suivant le marqueur de sectionclose
àsort
la fin pour prendre soin de contenu de fuitela source
Pour de telles tâches, je trouve souvent fastidieux d'écrire un script. Si cela ne doit être fait qu'une seule fois et peut-être pour quelques fichiers, cela peut être fait très bien en utilisant une macro si vous ouvrez le fichier
vim
et tapez:GoFAKE SECTION<ESC>
: ajoutez une fausse section à la fin et assurez-vous qu'elle se trouve au début de la ligne (vous l'avez peut-être activéecindent
ouautoindent
activée). Cela est également nécessaire pour trier la dernière section.gg
: retour au début du fichier, puis le fichier commence par une section descend une ligne avecj
qq
: démarrer l'enregistrement d'une macro pour s'enregistrer qv
: démarrer la sélection/^\S\+<Enter>
: recherchez le début de la section suivantek
: d'une ligne:!sort<Enter
: trier la sectionnj
: aller au premier élément de la section suivanteq
: arrêter l'enregistrement de la macro@q
: répéter la macro100@@
: répéter la macro plusieurs fois (jusqu'à ce qu'il ne reste plus de sections)dd
: supprime la dernière ligne du fichier (leFAKE SECTION
)Vous souhaiterez peut-être
:set lazyredraw
accélérer l'exécution des macros.la source