2010-09-04 7 views
7

J'ai un fichier texte avec un marqueur quelque part au milieu:fichier texte divisé en deux en utilisant un script bash

one 
two 
three 
blah-blah *MARKER* blah-blah 
four 
five 
six 
... 

J'ai juste besoin de diviser ce fichier en deux fichiers, d'abord tout contenant avant MARKER, et un deuxième contenant tout après MARQUEUR. Il semble qu'il peut être fait en une ligne avec awk ou sed, je ne peux pas comprendre comment.

J'ai essayé la méthode la plus simple - en utilisant csplit, mais csplit ne fonctionne pas bien avec le texte Unicode.

Répondre

4

Essayez ceci:

awk '/MARKER/{n++}{print >"out" n ".txt" }' final.txt 

Il va lire l'entrée de final.txt et produit out1.txt, out2.txt, etc ...

+0

Presque travaillé. Ne pas visser UTF-8, mais laisse * MARKER * dans le deuxième fichier. –

+0

Avez-vous essayé la solution présentée ici: http://www.unix.com/shell-programming-scripting/41060-split-file-into-seperate-files.html - Il utilise 'csplit' et fonctionne comme vous le souhaitez , c'est-à-dire laisser le marqueur sortir les fichiers. –

3
sed -n '/MARKER/q;p' inputfile > outputfile1 
sed -n '/MARKER/{:a;n;p;ba}' inputfile > outputfile2 

Ou tout en un:

sed -n -e '/MARKER/! w outputfile1' -e'/MARKER/{:a;n;w outputfile2' -e 'ba}' inputfile 
1

La commande split fera presque ce que vous voulez:

$ split -p '\*MARKER\*' splitee 
$ cat xaa 
one 
two 
three 
$ cat xab 
blah-blah *MARKER* blah-blah 
four 
five 
six 
$ tail -n+2 xab 
four 
five 
six 

Peut-être que c'est assez proche pour vos besoins.

Je ne sais pas si cela fonctionne mieux avec Unicode qu'avec csplit.

+0

Cette option ne semble pas être disponible dans la version de split incluse dans GNU coreutils; Je suppose que vous utilisez un BSD de certaines saveurs. Dans tous les cas, sur les systèmes d'exploitation basés sur GNU comme la plupart des distributions Linux, coreutils inclut à la fois split et csplit, donc ils devraient avoir un comportement Unicode similaire. –

10

vous pouvez le faire facilement avec awk

awk -vRS="MARKER" '{print $0>NR".txt"}' file 
+0

+1: Looove it. Tellement concis et élégant. J'ai eu besoin de ceci pour jeter une grande partie de la poubelle hors des logs qui provenaient d'un script de construction mal configuré. – Rekin

Questions connexes