imagen

sistemas operativos = on

de momento ...

Ahorrando tiempo de excel con bash awk

13.Jun.2019 — Julio

Tarea repetitiva con excel

Debido a un proceso de unificación de bases de datos, me pedían varias veces un excel resultante de la combinación de varios excel.

Si veo que esto será un proceso habitual y necesario a lo largo del tiempo, no me complico y prefiero hacer un programa que me lo genere directamente, pero como no es el caso pues será para unas pocas veces prefiero combinar los datos que ya tengo a un fichero.

Los ficheros excel de los que partía tienen varias columnas, más de 80, y el usuario que pedía el informe quería sólo unas columnas y en un orden específico. Ambas excel contenían en total varios miles de registros (>100K) por lo que siempre tocaba hacer:

  • abrir los dos excel
  • eliminar las columnas innecesarias
  • insertar columnas nuevas para por ejemplo sumas de otras (ventas, stock ..)
  • utilizar el BUSCARV para enlazar datos de una excel con la otra
  • reordenar las columnas con lo orden que se nos pide (cortar/insertar columna).

Bien, al final con la práctica y dependiendo de la memoria del pc que se utilice, todo eso lleva unos minutos.

Pero el Excel/Libreoffice cada vez que mueve columnas con fórmulas, si se tiene el cálculo automático activado, sufre de pausas de tiempo que molestan mucho. Lo mismo como hayas añadido tablas dinámicas.

Y menos mal que esta vez NO hacemos filtros de datos ni tampoco ordenamos, porque eso multiplica el tiempo de pausas en cada operación de cortar-insertar-filtrar-ordenar del Excel.

Ahorrando tiempo con awk

Me fastidia hacer siempre lo mismo pudiendo emplear el tiempo para otras cosas, además de que en las tareas repetitivas manuales es más fácil equivocarse y que te toque deshacer para volver a empezar.

Así que decido hacer un script en bash utilizando awk que me lea los dos ficheros csv y me genere un resultante con todo lo pedido. ¡no tarda más de 2 segundos de reloj! también dependiendo de la máquina.

Este es el script. Los ficheros csv iniciales son bv.csv y bz.csv de unos 21Mb cada uno.

#!/usr/bin/env bash
#cp /media/julio/vbbdd/datos_valladolid/ARTICULOS_Valladolid.csv bv.csv
#cp /media/julio/vbbdd/datos_zamora/ARTICULOS_Zamora.csv bz.csv
#
awk -F';' '
NR==FNR {
        zstock[$1]=$8;
        zventas[$1]=$85;
        zmcam[$1]=$86;
        next;
} 
{
        gsub("\r","");
        vventas=$85;
        vstock=$8;
        vmcam=$86;
        cventas=vventas+zventas[$1];
        cstock=vstock+zstock[$1];
        cmcam=vmcam+zmcam[$1];
        cggc=" ";
        encargo=" ";
        if ($1 == "CODIGO") {
                cventas="COOP_VENTAS_2019";
                cstock="COOP_STOCK";
                cmcam="COOP_UNIDADES_PDTES_PROVEEDOR";
                cggc="CODGGC";
                encargo="ENCARGO";
        }
        print $1,cggc,$6,$2,$40,$38,$39,$22,$20,$21,$30,$26,$41,$54,$55,$56,$57,$35,$3,cstock,cventas,cmcam,$5,encargo,$4
} ' OFS='\t' bz.csv bv.csv > bbdd_arts.csv

buscarv_fatima.sh

Dije 2 segundos y no llega ni a uno.

Lee primero un fichero separado por ";" donde recogemos los datos que necesitaremos consolidar, luego con el segundo fichero que lee va componiendo las columnas con las sumas, se crea la cabecera de texto con las columnas nuevas, y por fin guardamos todo un fichero separado por tabuladores listo para leer por el destinatario en su Excel.

Hay que tener en cuenta, repito, que no ordenamos ni tampoco hacemos filtros de datos. Si fuera así, el trabajo en Excel sería todavía más tedioso y en cambio con bash serían un par de palabras más añadidas al script.

Ver la cabecera y número de columna de un fichero csv

El inconveniente que se podría decir es que es laborioso con awk saber el número de campo que queremos imprimir, pues nos toca contar el orden de los campos para saber por ejemplo que la columna "ALTO" corresponde con el número de campo $54 del csv.

Para ello se tiene otra función que se carga automáticamente en bash que es fieldsc y muestra los campos de un csv y su numeración de forma fácil, y tampoco es una función muy complicada:

fieldsc

Como decía esta función y muchas otras las tengo disponibles siempre en el terminal pues se carga en el .bashrc con source bash_functions.sh.

Por cierto esta función es gentileza de Robert Mesibov ( BASHing data ) un maestro en lo que él mismo se autodenomina "data auditor and cleaning". Mucho que aprender de él en estos tiempos del Big Data.

Tags: bash, awk, excel

Comments? Tweet  

Crear ficheros csv a partir de uno exportado con ^%GOGEN en MUMPS

01.Apr.2019 — Julio

sobre exportar globals con ^%GOGEN

La utilidad ^%GOGEN nos permite sacar a disco dentro de la red donde se encuentre el servidor de Caché GLOBALS o ficheros de la base de datos. Permite sacar uno o varios a la vez.

El formato que tiene si lo editamos es parecido a esto:

Ver más ...

Tags: MUMPS, bash

Comments? Tweet  

Disfrutando de la linea de Comandos II, resultados de un Web Service a fichero excel

27.Jun.2018 — Julio

Continuación de Disfrutando de la linea de comandos I

Ya tenemos el resultado del web service obtenido con Curl

Y ahora tenemos que desgranar el resultado devuelto en JSON en ficheros excel. Habrá librerías o utilidades que dado un fichero texto csv lo convierta a formato Excel, pero si queremos ahorrarnos ese paso podemos crear ficheros tsv (separador tabulador) y nombrar a los ficheros con la extensión ".xls". Con ello se consigue que la mayoría de los ordenadores consigan abrir ese fichero en la hoja de cálculo.

Como ya comenté el formato JSON es repetitivo en mi opinión y más complicado de ser tratado por máquinas que un simple csv. Utilizaremos la herramienta jq que es capaz de desgranar cada elemento del JSON y además con una simple opción la formatea a formato @tsv o @csv.

Ver más ...

Comments? Tweet  

Gnuplot y bash, registro de carreras

15.Jun.2018 — Julio

Los que corremos, distancias superiores al kilómetro, solemos medir la velocidad no en Km/h ni en m/s sino que lo hacemos en relación al ritmo, en minuto/Km. Solemos decir voy a 4:30 o 5:55.

Tengo apuntados los entrenos desde hace mucho tiempo, con lo cual registro distancia, tiempo y título de descripción corta del trayecto efectuado entre otras muchas cosas.

En R ya tengo un programa que me saca muchos muchos datos, pero ahora me apetecía seguir aprendiendo bash y por ello decidí cómo sacar algunos datos e incluso un gráfico sólo con herramientas disponibles en la línea de comandos.

Ver más ...

Comments? Tweet  

Disfrutando de la linea de Comandos I Web Services con Curl

13.Apr.2018 — Julio

Intento no extenderme en cada uno de los puntos.

Linux, potencia en la línea de comandos

Tengo varios programas realizados en python y en Go que recogen datos utilizando web services, los manipulan, y los registran en mi ERP. Luego se utilizan otros servicios también con otros programas para devolver datos actualizados.

Cada vez más me gusta el poder utilizar herramientas que me da el propio sistemas operativo, sin necesidad de realizar programas en python o Go.

Es increíble la potencia de "awk", "sed", "grep" para manipular datos. Es también complicado pero con una línea en "bash" se puede hacer lo que en lenguajes de programación pueden ser 10.

Ver más ...

Comments? Tweet  

FreeBSD como repositorio de copias

09.Dec.2017 — Julio

En mi trabajo la red se compone principalmente de servidores windows, aunque los hay Ubuntu, Suse y algunas versiones de FreeBSD. Los puestos de clientes más de lo mismo.

En estos dias el ransomware está al orden del día, por lo que aparte de las medidas de seguridad diarias como copias, antivirus, firewall, avisos al personal sobre el uso de internet y los correos, etc ... es mejor tener un plan para cuando te toque el día restablecer cuanto antes los servidores y los datos.

En una red windows es bastante habitual tener carpetas compartidas, para grupos de empleados, intranet, documentación, etc.. El ransomware las utiliza para expandirse por lo que me tocó hacer una revisión completa de las que eran verdaderamente necesarias y sobre todo ajustando los permisos a los mínimos necesarios. Lo mismo con los usuarios, bajando privilegios de acceso lo más posible.

Ver más ...

Comments? Tweet  

Control Cámara IP con ~~Whatsapp~~ Telegram

18.Nov.2015 — Julio

Se trata de utilizar la cámara IP con Wifi Foscam FI9804W que permite uso en exteriores.

Con la aplicación de mensajería Telegram, podemos activar la detección de movimiento que lleva esa cámara, desactivarla, pedir una foto, etc..

Así no nos hace falta ni estar delante de ella, ni ningún acceso web al interface de la cámara.

Un pequeño video para mostrar lo que se pretende.
video resumen

Ver más ...

Comments? Tweet  

Where do you store your passwords

10.Aug.2015 — Julio

Do you trust in cloud services like Dropbox, Onedrive, Google Drive ... to store your private data?
No I don't. I prefer local data. If my data is stolen is only my fault.

Do you need many passwords to manage your workday?
Yes I do.

Do you prefer plain text files over other kind?
Yes I do. They will be read forever? I guess...

Do you want a little security for your data?
Encrypts your data!

Ver más ...

Comments? Tweet  

Telegram Wifi On or Wifi Off

17.Jun.2015 — Julio

Sending a Telegram message I can enable or disable Wifi in my home router.

Hey Kids! go to study and leave off mobile phone!

telegram, scripts!

Tags: telegram, lua, bash

Comments? Tweet  

Telnet script to disable wifi in router Observa Telecom

13.Mar.2015 — Julio

My son sometimes is connected to internet until several hours past night.
I tried to convince that he needs several hours of sleep... but he is 14 years old...

So the fastest way is disabling wifi at home, and I made it in the easiest way too.

observawifidisable.sh

```  
sh << EOF | telnet 192.168.1.1    
sleep 1   
echo 1234  
sleep 1  
echo password  
echo wlan disable  
sleep 2  
echo exit  
sleep 1  
echo Y  
EOF  
```

I put this scritp in the crontab of my home server

10 0 * * * sh /home/me/observa_wifi_disable.sh > /home/me/observa_wifi_disable.sh

Then I made another script, same disable but now enabling wifi. Only I had to change wlan disable by wlan enable

Yes, I know. It's ugly code, but It works with little lines.

Tags: bash, routers

Comments? Tweet  

Disfar-R-Telegram

06.Feb.2015 — Julio

A veces es mejor recibir una imágen que muchas lineas de texto con porcentajes... Y sin intervención de usuario mejor ;-)
todos los dias de forma automática

Ver más ...

Comments? Tweet