Posts etiquetados ‘scripts’

Buscar y reemplazar desde Ruby

Noviembre 8, 2009

Dado que la línea de comando es un chorizo de caracteres que no siempre es fácil recordar, pensé en hacer un script en ruby que hiciera lo mismo pero con una sintaxis de tipo:

srchreplace cadena_a_buscar cadena_nueva *.php

Básicamente lo que quería hacer era, por ejemplo, encontrar todos los archivos de php que hacen  referencia a “contabilidad.php” y cambiarlos por “contabilidad.py” .

Lo primero, para no reinventar la rueda fue buscar un script similar. Lo más parecido que encontré fue en la página “Erik on Rails“. Si bien no era exactamente lo mismo, tenía una clase que se podía aprovechar. Gracias Erik.

Lo segundo fue crear el script que haga uso de esa clase.

Acá va el script:

#!/usr/bin/env ruby
class File
def replace(pattern, string)
full_path = File.expand_path path
return if !File.file?(full_path)

reopen(full_path, 'r')
lines = readlines

changes = false
lines.each do |line|
changes = true if line.gsub!(pattern, string)
end

if changes
reopen(full_path, 'w')
lines.each do |line|
write(line)
end
close
end
end
end

if ARGV.count != 3
puts "Error: argumentos incorrectos"
puts "Uso: srchrep.rb cadena_buscar cadena_reemplazar archivos"
puts "Donde 'archivos' es una lista de archivos en formato *.* entre comillas "
else
# ver si existe archivo
# hacer una lista de archivos que tengan la cadena buscada
files = Dir.glob(ARGV[2])
numarch = files.count
# por cada archivo de la lista
for filename in files
arch = File.open(filename)
arch.replace(/#{ARGV[0]}/,ARGV[1])
end
end

El principal problema es que el shell convierte la línea de comandos expandiendo los comodines, por lo cual la sintaxis pasa a ser:

./srchreplace.rb cadena_buscar cadena_reemplazar "*.php"

No encontré manera más elegante de hacerlo. Pero me resulta práctico.

Exploración de datos con Epi Info 6.04

Octubre 7, 2008

Siguiendo con la serie Epi Info, les paso un “pique” para explorar cómodamente los datos almacenados.

En primer lugar, ejecuto el archivo de comandos donde tengo definidas las variables con sus etiquetas correspondientes. En le caso de la investigación que estamos haciendo en el momento (sobre Intentos de AutoEliminación) se llama IAES.PGM.

Eso hace que queden definidas variables que después voy a usar para cruzar.

En segundo lugar, ejecuto el comando: ROUTE tablas.txt <ENTER>

Con eso lo que hago es que se guarde todo lo que voy a hacer a partir de ahora en el archivo llamado tablas.txt. Creo un acceso directo a ese archivo (que va a estar dentro del directorio de Epiinfo, generalmente C:\EPI6) en algún lugar que me quede cómodo (en Win: dentro de “Mis Documentos” o similar).

En tercer lugar, comienzo a jugar con las variables haciendo cruzamientos con el comando TABLES.

Para eso escribo TABLES <ESPACIO> y oprimo la tecla F3, con lo cual se me despliega una lista de variables. Uso preferentemente las que están al final ya que son las que tienen definidas etiquetas en lugar de códigos numéricos (para eso fue que ejecuté antes el IAES.PGM).

Entonces, en comandos queda:

run iaes.pgm
route tablas.txt
tables sexo metodo

Con eso se generan acumulativamente los resultados en tablas.txt, con lo cual puedo explorar lo que se me ocurra y mirar después tranquilo los resultados.

Eventualmente, aquellos cruzamientos que me interesan, los incluyo como una línea más dentro del programa (IAES.PGM).

Ejemplo de script (programa) para EpiInfo 6.04

Octubre 4, 2008

Cuando tengo que analizar datos en EpiInfo, me queda más cómodo hacer un pequeño script (programa) para que procese todo y genere un archivo de texto con el resultado, para poder verlo más tranquilo y no quedarme corto con la pantalla.

Actualmente uso EpiInfo 6.04 (versión para DOS) con Linux, mediante DosBox (uso Ubuntu, está en los repositorios). La instalación de Epi en Linux excede esta nota (puede ir en siguiente post). De todos modos, en Linux tienen (también en los repositorios de Ubuntu) el PSPP, clon del SPSS.

En Windows: crear con el Notepad (Block de notas) un archivo y guardarlo con un nombre apropiado (8 caracteres: límite de DOS) con extesión “.pgm” (por ejemplo: “analizar.pgm”).

El texto de un programa tipo está a continuación con comentarios (en Epi, el asterisco marca los comentarios). Uso IAES como nombre de archivo porque se trata de datos sobre Intentos de AutoEliminación).

* Leer el archivo donde están guardados los datos
read iaes.rec
* Borrar el archivo de SALIDA DE DATOS si es que existe alguno
erase iaes.txt
* Indicarle al sistema que escriba los resultados en un archivo de texto llamado IAES.TXT
route iaes.txt
* Setea variables internas acerca de qué datos estadísticos mostrar
set statistics=on
set percents = on
* La variable DIAGNOSTIC indica quién realizó el diagnóstico del IAE, la voy a recodificar para convertir los códigos numéricos en valores más legibles.
* Definir una variable (DIAG) en modo TEXTO, con 10 caracteres (son 10 guiones bajos)
define diag __________
* Recodificar la variable original (DIAGNOSTIC) que tenía valores numéricos en la variable nueva (DIAG)
* codificando el 1 como Médico, 2 como Residente, 3 como Otro y (IMPORTANTE) declarando 9 como valor MISSING (equivalente a SIN DATOS). Fundamental para el procesamiento adecuado de los datos (ver el PUNTO luego del signo de IGUAL al final).
recode diagnostic to diag 1=Medico, 2=Residente, 3=Otro, 9=.
* Calcular las frecuencias de los valores de la variable DIAG
freq diag
* Aplico el mismo esquema para el resto de las variables que me interesan
* ==================================
define entrev __
recode entrevista to entrev 1=Si, 2=No, 9=.
freq entrev
* Con las edades, se requiere de una aproximación distinta.
* Creo una variable llamada RANGO_EDAD para convertir las edades a rangos
define rango_edad ___________________
* Recodifico EDAD en RANGO_EDAD, agrupando de 10 en 10
recode edad to rango_edad by 10
* Calculo las frecuencias de rangos de edad
freq rango_edad
* Los barrios no están codificados y son un campo alfanumérico, por lo que no necesito recodificación
freq barrio
close *
* CIERRA TODOS LOS ARCHIVOS
close iaes.txt

Guardan el archivo PGM dentro del directorio de EpiInfo.
Guardan el archivo de datos (REC) también dentro del directorio EpiInfo.
Luego ejecutan EPIINFO (abren una ventana de comando, teclean “C:\EPI6 <ENTER>”)
Van al menú PROGRAMA -> ANALISIS

En la ventana de análisis teclean:

run iaes.pgm <ENTER>

(sustituyan IAES.PGM por el nombre que le hayan puesto a su archivo).
Si está todo OK, se ejectuan todas las órdenes (las ven pasar en pantalla). Si no está todo OK, aparece una ventana de error y se detiene todo. Continúan con <ESCAPE>.
Para ver el resultado, abren con el block de notas el archivo IAES.TXT (o el nombre que le hayan puesto), que está dentro del directorio de EpiInfo.
Cada vez que ejecuten el programa, ese archivo se crea de nuevo, por lo cual no tiene sentido modificarlo a mano. Simplemente es para tener el resultado visible y poder cortar y pegar en otro lado.

Respaldo de mysql desde línea de comando

Octubre 3, 2008

Problema: Dos por tres tengo que respaldar una base de datos mysql en un servidor remoto, comprimir el archivo y copiarlo a mi computadora. Cada vez que lo voy a hacer, busco en internet el comando de respaldo porque nunca me lo acuerdo. Lo posteo aquí para encontrarlo rápido la siguiente vez que lo necesite. La alternativa es tomar algo para la memoria.

Solución 1:

mysqldump -h localhost -u username -p database_name > backup_db.sql
gzip backup_db.sql
scp backup_db.sql.gz usuario@direccion.del.servidor:/directorio/directorio

Solución 2 (en proceso): hacer un script que realice todo esto de manera automática y ponerlo como comando de ejecución programada en cron. Va en siguiente post.

Bajar videos de Youtube con Konqueror

Enero 12, 2008

Encontré este add-in para Konqueror para bajar Y codificar videos de you tube. El programa está hecho en python y es un lindo ejemplo de add-in para Konqueror. Por el momento no logra codificar bien desde FLV a MPG, pero sospecho que es un bug del encoder no del script.