Discussion:
sustituir caracteres
(demasiado antiguo para responder)
jose maria
2010-02-22 20:07:58 UTC
Permalink
* Obtengo un listado gigantesco de la forma siguiente
ls -1Q -I undel /media/cluster1/trash > fichero.tx

* Es de un directorio de cuarentena de un cluster, por lo que tiene
caracteres especiales, inodos y datos que he de substituir por una ruta
correcta a los puntos de montaje reales y me estoy haciendo un lio con cut,
sed, tr, etc, al final estoy produciendo 3 ficheros intermedios y al ultimo
le he de aplicar a todas las lineas un comando, se ejecuta con bash y cron,
no doy con la tecla de algo decente, me da igual el lenguaje.

* Las lineas recibidas son de este estilo.
"0000190E|ftp01|CBR101031|eb|copia server enjul|copia server"
"0000851B|ftp01|CBR101265|eb|Copia BBDD Sql server|Copia BBDD Sql
server_20100217_2305.zip.z021.pgp"
"00008551|ftp01|CBR101265|eb|Copia Documentos|Copia
Documentos_20100219_1900.zip.z220.pgp"
"00008554|ftp01|CBR101270|eb|dirs.dat.pgp"
"00008558|ftp01|CBR101270|eb|repair.rep"
"00008596|ftp01|CBR101331|eb|dirs.dat.pgp"
"002CBCFF|ftp03|CBR101321|eb|Datos7 19.02.2010 07.12|log_20091002_2216.txt"
"002CBD00|ftp03|CBR101321|eb|Datos7 19.02.2010 07.12|log_20091003_2204.txt"
"002CBD01|ftp03|CBR101321|eb|Datos7 19.02.2010 07.12|log_20091004_2208.txt"
"002CBD02|ftp03|CBR101321|eb|Datos7 19.02.2010 07.12|log_20091005_2250.txt"

* ignorese el salto de linea, el entrecomillado es una linea completa.

* Y debo de producir un resultado final como este y aplicarle un comando a
cada linea.

"/media/cluster1/ftp01/CBR101031/copia server enjul/copia server"
"/media/cluster1/ftp03/CBR101321/eb/Datos7 19.02.2010
07.12/log_20091005_2250.txt"

* Primero con tr substituyo los | por / , despues con cut busco el primer
separador / , y por ultimo substituyo la cadena anterior al separador por
"/media/cluster1/ y aplico el comando, en fin un lio y todo esto a traves
de cron.

* Nota: Lo habitual es que sean unas 700.000.- lineas, no me importa el
tiempo de ejecucion, si no que no produzca fallos con los espacios y demas.
Gonzalo Pérez de Olaguer Córdoba
2010-02-22 20:47:40 UTC
Permalink
Post by jose maria
* Obtengo un listado gigantesco de la forma siguiente
ls -1Q -I undel /media/cluster1/trash > fichero.tx
* Es de un directorio de cuarentena de un cluster, por lo que tiene
caracteres especiales, inodos y datos que he de substituir por una ruta
correcta a los puntos de montaje reales y me estoy haciendo un lio con cut,
sed, tr, etc, al final estoy produciendo 3 ficheros intermedios y al ultimo
le he de aplicar a todas las lineas un comando, se ejecuta con bash y cron,
no doy con la tecla de algo decente, me da igual el lenguaje.
* Las lineas recibidas son de este estilo.
"0000190E|ftp01|CBR101031|eb|copia server enjul|copia server"
"0000851B|ftp01|CBR101265|eb|Copia BBDD Sql server|Copia BBDD Sql
server_20100217_2305.zip.z021.pgp"
"00008551|ftp01|CBR101265|eb|Copia Documentos|Copia
Documentos_20100219_1900.zip.z220.pgp"
"00008554|ftp01|CBR101270|eb|dirs.dat.pgp"
"00008558|ftp01|CBR101270|eb|repair.rep"
"00008596|ftp01|CBR101331|eb|dirs.dat.pgp"
"002CBCFF|ftp03|CBR101321|eb|Datos7 19.02.2010 07.12|log_20091002_2216.txt"
"002CBD00|ftp03|CBR101321|eb|Datos7 19.02.2010 07.12|log_20091003_2204.txt"
"002CBD01|ftp03|CBR101321|eb|Datos7 19.02.2010 07.12|log_20091004_2208.txt"
"002CBD02|ftp03|CBR101321|eb|Datos7 19.02.2010 07.12|log_20091005_2250.txt"
* ignorese el salto de linea, el entrecomillado es una linea completa.
* Y debo de producir un resultado final como este y aplicarle un comando a
cada linea.
"/media/cluster1/ftp01/CBR101031/copia server enjul/copia server"
"/media/cluster1/ftp03/CBR101321/eb/Datos7 19.02.2010
07.12/log_20091005_2250.txt"
* Primero con tr substituyo los | por / , despues con cut busco el primer
separador / , y por ultimo substituyo la cadena anterior al separador por
"/media/cluster1/ y aplico el comando, en fin un lio y todo esto a traves
de cron.
esto lo puedes hacer más fácil con sed:

sed -e 's=^([^/]+)="/media/cluster1='
Post by jose maria
* Nota: Lo habitual es que sean unas 700.000.- lineas, no me importa el
tiempo de ejecucion, si no que no produzca fallos con los espacios y demas.
Si sólo has de hacer estos dos cambios que explicas aquí, y luego aplicar
un comando a cada línea, tendrías algo así:

cat fichero_original | tr \| / | sed ... | xargs -1 comando

Lo digo de memoria. Tú sabrás mejor que yo qué es exactamente lo que quieres
hacer. Pero esa secuencia será bastante rápida de ejecutar.

Si quieres un único ejecutable, lo harás bien con perl.
--
Gonzalo Pérez de Olaguer Córdoba <***@iies.es> --- www.gpoc.es
PGP key 2861C704 --- F206 5671 6789 425D 111C 1302 214F 1934 2861 C704
Ignacio Arenaza
2010-02-22 21:32:57 UTC
Permalink
Post by jose maria
* Y debo de producir un resultado final como este y aplicarle un comando a
cada linea.
"/media/cluster1/ftp01/CBR101031/copia server enjul/copia server"
"/media/cluster1/ftp03/CBR101321/eb/Datos7 19.02.2010
07.12/log_20091005_2250.txt"
Una de tantas formas, suponiendo que las comillas dobles de inicio y
fin que has escrito no formen parte de las líneas en sí (se muestra en
varias lineas, pero debería ir en una sola):

awk -F'|' '{ print "/media/cluster1/" $2 "/" $3 "/" $4 "/" $5 "/" $6}'
fichero | while read i; do orden -parametros "$i"; done;

Si las lineas realmente contienen los caracters '"' al comienzo y al
final, algo como esto debería funcionar:

awk -F'|' '{ print "/media/cluster1/" $2 "/" $3 "/" $4 "/" $5 "/"
substr($6,1,length($6)-1)}' fichero | while read i; do orden
-parametros "$i"; done;

Saludos,
Iñaki.

- --
Mondragon University

GPG Key available at public keyservers
jose maria
2010-02-24 14:14:39 UTC
Permalink
Post by Ignacio Arenaza
Una de tantas formas, suponiendo que las comillas dobles de inicio y
fin que has escrito no formen parte de las líneas en sí (se muestra en
awk -F'|' '{ print "/media/cluster1/" $2 "/" $3 "/" $4 "/" $5 "/" $6}'
fichero | while read i; do orden -parametros "$i"; done;
Si las lineas realmente contienen los caracters '"' al comienzo y al
awk -F'|' '{ print "/media/cluster1/" $2 "/" $3 "/" $4 "/" $5 "/"
substr($6,1,length($6)-1)}' fichero | while read i; do orden
-parametros "$i"; done;
* Veo la idea lo que pasa es que produce efectos diferentes en las lineas,
seguramente por que en rutas muy largas el cluster elimina caracteres del
inodo, voy a ver si descubro el motivo, he hablado con los desarrolladores
para que la "papelera" se liste con rutas de directorios standard relativas
al punto de montaje del cluster, la utilidad es para rebajar el numero de
copias de los ficheros que han sido marcados para borrar en el cluster y que
quedan listados en la "papelera" por el tiempo especificado de cuarentena,
pero se mantienen todas las copias en sus chunks origianles hasta que son
borrados definitivamente, dandole un setgoal 1 a todos los de la papelera
reduzco el espacio ocupado por ficheros de los que no necesito tolerancia a
fallos, estamos hablando de 700.000 x n copias, puesto que el usuario ha
dado la orden de borrado. gracias.


* Un saludo, jose maria.

Loading...