Comment diviser un gros fichier en deux parties, selon un modèle?
Donné un exemple file.txt
:
ABC
EFG
XYZ
HIJ
KNL
Je veux diviser ce fichier en XYZ
tel qu'il file1
contient des lignes vers le haut XYZ
et le reste des lignes file2
.
text-processing
sed
awk
split
d.putto
la source
la source
XYZ
ligne doit-elle être incluse ou non dans la sortie?Réponses:
Avec
awk
vous pouvez faire:Explication: Le premier
awk
argument (out=file1
) définit une variable avec le nom de fichier qui sera utilisé pour la sortie pendant lelargefile
traitement de l' argument suivant ( ). Leawk
programme imprimera toutes les lignes dans le fichier spécifié par la variableout
({print >out}
). Si le motifXYZ
est trouvé, la variable de sortie sera redéfinie pour pointer vers le nouveau fichier ({out="file2}"
) qui sera utilisé comme cible pour imprimer les lignes de données suivantes.Les références:
la source
C'est un travail pour
csplit
:serait
s
ilently diviser le fichier, la création de pièces avec préf
ixfile
etn
umbered à l' aide d' un seul chiffre, par exemple ,file0
etc. Notez que l' utilisation/regex/
décomposerait, mais ne comprenant pas la ligne qui correspondregex
. Pour diviser jusqu'à et y compris la mise en correspondance de ligneregex
ajouter un+1
décalage:Cela crée deux fichiers
file0
etfile1
. Si vous avez absolument besoin qu'ils soient nommésfile1
et quefile2
vous puissiez toujours ajouter un modèle vide à lacsplit
commande et supprimer le premier fichier:crée
file0
,file1
etfile2
maisfile0
est vide de sorte que vous pouvez en toute sécurité supprimer:la source
Avec une version moderne,
ksh
voici une variante de shell (c'est-à-dire sanssed
) de l'une dessed
réponses ci-dessus:Et une autre variante en elle-
ksh
même (c'est-à-dire en omettant également lacat
):(La
ksh
solution pure semble être assez performante; sur un fichier de test de 2,4 Go, elle a nécessité 19 à 21 secondes, contre 39 à 47 secondes avec l' approchesed
/cat
).la source
read
etprint
- vous devriez simplement le laisser aller à la sortie qui lui est propre. Les performances s'améliorent si vous construisez entièrement la boîte à outils AST etksh
compilez tous les buildins - c'est bizarre pour moi que cesed
ne soit pas l'un d'eux, en fait. Mais avec des trucs commewhile <file do
je suppose que vous n'avez pas besoin desed
tant de choses ...awk
avez-vous performé dans votre benchmark? Et même si je suis sûr que vousksh
gagnerez probablement toujours ce combat, si vous utilisez un GNU,sed
vous n'êtes pas très justesed
- GNU's-u
nbuffered est une approche pauvre en pisse pour s'assurer POSIXLY que le décalage du descripteur est laissé là où le programme s'est arrêté. il - il ne devrait pas être nécessaire de ralentir le fonctionnement régulier du programme - la mise en mémoire tampon est très bien - toutsed
devrait avoir à faire est de chercher le descripteur une fois terminé. Pour une raison quelconque, GNU renverse cette mentalité.while
; l'impression est implicitement effectuée comme l'effet secondaire défini de l'<##
opérateur de redirection. Et seule la ligne correspondante doit être imprimée. ( De cette façon , la mise en œuvre de fonction de coque est plus flexible pour le soutien de incl./excl.) Une explicitewhile
boucle je pense être important plus lent (mais n'ai pas vérifié).head
au lieu duread
; il semble un peu plus lent, mais il code terser:{ head -1 <##XYZ ; { read <##"" ;} >file4 ;} <largefile >file3
.Avec GNU,
sed
vous devez utiliser le-u
commutateur nbuffered. La plupart des autressed
s devraient tout de même fonctionner.Pour exclure XYZ ...
la source
Essayez ceci avec GNU sed:
la source
sed -e '1,/XYZ/{w file1' -e 'd}' large_file > file2
Un hack facile consiste à imprimer sur STDOUT ou STDERR, selon que le motif cible a été mis en correspondance. Vous pouvez ensuite utiliser les opérateurs de redirection du shell pour rediriger la sortie en conséquence. Par exemple, en Perl, en supposant que le fichier d'entrée est appelé
f
et les deux fichiers de sortief1
etf2
:Supprimer la ligne qui correspond au modèle de fractionnement:
Y compris la ligne assortie:
Vous pouvez également imprimer dans différentes poignées de fichier:
Supprimer la ligne qui correspond au modèle de fractionnement:
Y compris la ligne assortie:
la source