Linux en Espanol
 
[SOLUCIONADO]Sacar grupos de datos de un fichero (tema #24264)
Publicar nuevo tema  Responder al tema    Foros de discusión -> Programación
Autor Mensaje
templix
Forista


Registrado: 2006-01-15
Mensajes: 20

Publicado: 2012-02-04 06:02:22    Asunto: [SOLUCIONADO]Sacar grupos de datos de un fichero

Tengo un archivo con datos agrupados en una cantidad variable de lineas consecutivas y separados entre ellos por uno o dos espacios en blanco del tipo:

gonzalez
antonio gonzalez izquierdo
c/ buendia 12
madrid

rodriguez
jose rodriguez gomez
informatico de cuidado
un buen elemento
c/ norte 23
segovia

gutierrez
cuesta de arriba 27
ciudad real

Quisiera enviar cada grupo de datos de este documento a un archivo de tal forma que el resultado, para este caso concreto que he puesto, fueran 3 archivos: uno, por nombre "gonzalez" con los datos de gonzalez, otro con nombre "rodriguez" con los datos de rodriguez y el ?ltimo por nombre "gutierrez" con los de gutierrez.
Estoy batallando con if, sed, awk y pipes pero mis conocimientos de bash no est?n a la altura de mis prop?sitos. ?Puede alguien echarme una mano?
miguelgf
Forista


Registrado: 2006-12-28
Mensajes: 621

Publicado: 2012-02-04 16:17:14    Asunto:

Hola.

Seguramente con awk se pueda hacer pero yo lo veo m?s un problema para resolver con perl, php, o alg?n otro lenguaje de programaci?n.

Saludos.

Miguel.
templix
Forista


Registrado: 2006-01-15
Mensajes: 20

Publicado: 2012-02-05 05:30:19    Asunto:

Pues si con bash todav?a me puedo pelearme con la soluci?n, con perl, php, pytho o el que sea ya me has "matao"....
miguelgf
Forista


Registrado: 2006-12-28
Mensajes: 621

Publicado: 2012-02-06 00:23:13    Asunto:

Hola.

Lo de sugerir perl, python o similar es por comodidad, porque programar en awk es un poco engorroso, pero lo que t? buscas no es complicado.
Haz un script ejecutable con el contenido:
[code:1:52b5e13d3a]#!/bin/bash
cat $1 | awk 'BEGIN {ESTADO=1} \
{ \
if (ESTADO == 1 && NF == 0) \
{ESTADO=1} \
else { if (ESTADO==1 && NF != 0) {NOMBRE=$1; ESTADO=2; print $0 >> NOMBRE} \
else { if (ESTADO==2 && NF == 0) {ESTADO=1} \
else { print $0 >> NOMBRE } \
} \
} \
}'
[/code:1:52b5e13d3a]
y ll?malo pas?ndole como par?metro el fichero de datos.
Hace exactamente lo que t? quieres.

Pero insisto que cualquier otro lenguaje es menos inc?modo que awk. Si te fijas no es un problema de bash, sed, etc. Todo el script es un programa de awk
Te he dejado los cautro casos: ESTADO = 1 ? 2 y NF = 0 ? 1 por claridad, porque realmente el primer IF es est?pido, no aporta nada salvo dejar el c?digo m?s claro.
NF es una variable interna de awk, ESTADO es m?a, vale 1 cuando no se sabe a?n el nombre del fichero y 2 cuando s? se sabe.

Saludos.

Miguel.
templix
Forista


Registrado: 2006-01-15
Mensajes: 20

Publicado: 2012-02-06 15:21:13    Asunto:

Funciona de maravilla. Agradecid?simo y much?simas gracias...
miguelgf
Forista


Registrado: 2006-12-28
Mensajes: 621

Publicado: 2012-02-06 15:35:11    Asunto:

Hola.

De nada, ha sido un placer.

Lo que s? te recomiendo es que enredes un poco y cambies la estructura de los IF para que en vez de estar hechos para una explicaci?n, est?n hechos con un poco m?s de "limpieza" y con eso practicas.

Y de paso edita el t?tulo del post y comi?nzalo con "SOLUCIONADO", que es una costumbre en este foro que cada vez menos gente hace.

Por ?ltimo, te agradezco que me des las gracias. ?ltimamente lo hace cada vez menos gente y es bueno ver que a?n quedan personas educadas.

Si tienes m?s problemas, ya sabes donde estamos.

Saludos.

Miguel.
templix
Forista


Registrado: 2006-01-15
Mensajes: 20

Publicado: 2012-02-06 16:35:22    Asunto:

Ya lo he mandado a los tres colegas con los que estaba estruj?ndome las neuronas y seguiremos tus consejos para dejarlo fino, fino.... o al menos lo intentaremos... ya he puesto el solucionado en el t?tulo... y de nuevo muchas gracias.
TheBalrog
BOFH
Registrado: 2004-04-05
Mensajes: 3012

Publicado: 2012-02-07 00:14:59    Asunto:

Miguel, gracias por la ayuda. Personalmente aprendo cada vez que respondes de esta forma tan profesional.

templix, una vez que modifiques el c?digo ?puedes publicarlo en el foro? La idea es que los que tengan el mismo problema puedan revisarlo y aprender.
templix
Forista


Registrado: 2006-01-15
Mensajes: 20

Publicado: 2012-02-07 20:20:21    Asunto:

Por supuesto, pero los ajustes ser?n minucias si se comparan con la maravilla con awk de Miguel....
templix
Forista


Registrado: 2006-01-15
Mensajes: 20

Publicado: 2012-04-01 06:05:29    Asunto:

No penseis que no me acuerdo del compromiso... ja ja ja... el problema es que hemos vuelto a empezar desde cero porque como anticipaba Miguel, lo que pretend?amos con bash nos ha llevado a una situaci?n sin salida. Al final lo hemos tenido que hacer con python pero el resultado empieza a tener una forma bastante decente... en breves d?as lo subiremos como entrada de tema nuevo.





La marca registrada Linux (R) se usa siguiendo la sublicensia obtenida del "Linux Mark Institute",
el LICENCIATARIO exclusivo de Linus Torvalds, propietario de la marca en EEUU y otros países
The registered trademark Linux (R) is used pursuant to a sublicense from the Linux Mark Institute,
the exclusive LICENSEE of Linus Torvalds, owner of the mark in the U.S. and other countries