J'ai un fichier texte que je veux diviser en 64 parties inégales, selon les 64 hexagrammes du Yi Jing. Comme le passage pour chaque hexagramme commence par un ou plusieurs chiffres, un point et deux nouvelles lignes, l'expression régulière devrait être assez facile à écrire.
Mais comment puis-je réellement diviser le fichier texte en 64 nouveaux fichiers selon cette expression régulière? Cela semble être plus une tâche pour perl
. Mais il y a peut-être une façon plus évidente de me manquer totalement.
la source
'\.'
ne marchera pas aussi?Je pense que la meilleure façon est
awk
etgawk
.awk
-F
spécifiera des champs séparés pour chaque ligne. Il s'agit d'une expression régulière, ici nous utilisons plusieurs séparateurs:". "
et" / "
. Ainsi une ligne comme1. Ch'ien / The Creative
sera divisée en 3 champs:1
Ch'ien
etThe Creative
. Plus tard, nous pouvons nous référer à ces champs avec$n
.$0
est toute la ligne.Nous demandons ensuite à awk de faire correspondre les lignes avec le motif.
^[0-9]{1,3}[.]
S'il y a correspondance, nous attribuons ensuite une valeur àx
. La valeur x sera utilisée comme nom de fichier pour l'print
opération. Dans cet exemple, nous utilisons"F"$1"("$2").txt"
donc la ligne1. Ch'ien / The Creative
donne un nom de fichierF1(Ch'ien).txt
rester bouche bée
Dans gawk, nous pouvons également accéder au groupe capturé. Nous pouvons donc simplifier la commande pour:
ici, nous utilisons
match
la capture des groupes et les mettons dans la liste des variablesary
.$0
est toute la ligne.ary[0]
est tout assorti.ary[1...n]
est chaque groupe.perl
On peut aussi le faire avec perl:
Résultats:
comment obtenir l'exemple de fichier:
la source
Avec GNU coreutils, vous pouvez utiliser
csplit
pour diviser un fichier en morceaux délimités par des expressions rationnelles, comme le montre geekosaur .Voici un script awk portable pour diviser un fichier en morceaux. Cela fonctionne par
getline
pour traiter le séparateur multiligne (2 lignes);outfile
sur le nom du fichier sur lequel imprimer, lorsqu'un en-tête de section est rencontré.la source
nunber.
est suivi d'un texte contenant une barre oblique/
. Je suis presque sûr que lestwo newlines
ixtmixilix mentionnés sont les 2 lignes vides qui précèdent l'identifiant numérique et identifieraient plus spécifiquement l'en-tête, mais comme les données sur la page Web ne correspondent que/^[0-9]+\.
dans les en-têtes de section, il n'est pas nécessaire de les traiter ( dans ce cas particulier). Merci; surtout pour l'intro degetline
.. PS. peut tout être si?while
est là si l'entrée contient1.\n2.\n\n
(où\n
sont des sauts de ligne): le2.
doit être reconnu dans la ligne d'en-tête. Cela ne va pas se produire ici, mais je le soutiens dans mon code pour le rendre plus général (et correspondre plus strictement aux spécifications de la question).