2010-09-04 20 views
7

Tengo un archivo de texto con un marcador en un punto intermedio:dividida en dos usando escritura del golpe

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

sólo hay que dividir el archivo en dos archivos, primero contiene todo antes MARCADOR, y la segunda, que contiene todo lo que después MARCADOR. Parece que se puede hacer en una línea con awk o sed, simplemente no puedo entender cómo.

Probé la manera fácil - usando csplit, pero csplit No juega bien con el texto Unicode.

Respuesta

4

Prueba esto:

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

leerá el aporte de final.txt y produce out1.txt, out2.txt, etc ...

+0

casi funcionó. No arruina UTF-8, pero deja * MARKER * en el segundo archivo. –

+0

Ha intentado la solución que se muestra aquí: http://www.unix.com/shell-programming-scripting/41060-split-file-into-seperate-files.html - Utiliza 'csplit' y funciona de la manera deseada , es decir, dejar que el marcador salga de los archivos. –

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

O todo en uno:

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

El comando split hará casi lo que quiera:

$ 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 

tal vez es lo suficientemente cerca como para sus necesidades.

tengo ni idea de si lo hace mejor con Unicode que csplit, sin embargo.

+0

Esa opción no parece estar disponible en la versión de split incluida en GNU coreutils; Supongo que estás usando un BSD de algún sabor. En cualquier caso, en sistemas operativos basados ​​en GNU como la mayoría de las distribuciones de Linux, coreutils incluye split y csplit, por lo que deberían tener un comportamiento Unicode similar. –

10

puede hacerlo fácilmente con awk

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

+1: Looove it. Muy conciso y elegante. He estado necesitando esto para descartar una gran parte de la basura de los registros que provienen de script de compilación mal configurado. – Rekin

Cuestiones relacionadas