Vous êtes sur la page 1sur 25

Preprocesamiento de archivos con

datos de equipos de medicin.


David Pineda Osorio dpineda@ug.uchile.cl

Introduccin.
Este documento consiste en la descripccin de los procedimientos a llevar a cabo para estandarizar
las distintas estructuras de datos provenientes de formatos definidos por los fabricantes de equipos
de medicin, tales como sensores o estaciones meteorolgica.
El objetivo, por lo tanto, es lograr un formato tipo estandar que nos permita pasar estos datos y
cargarlos a una database, graficarlos o cualquier trabajo a realizar con ellos.
Esto es de utilidad ya que, una vez establecidos los procedimientos, se hace posible aplicar las
metodologas cada vez que sea necesario.
Para caracterizar las metodologas se har necesario trabajar con formatos y estructuras reales, es
decir se utilizaran los formatos provistos por equipos de tipo Diver, Solinst, Hobo y Campbell.
La abstraccin de los algoritmos explican los pasos a seguir para obtener cierto estandar deseado,
sin embargo es posible aplicar estos en una capa de abstraccin superior que utiliza lenguajes de
scripts nativos de gnu-linux bash, awk o python que permiten computar y aplicar procedimientos de
mquina a los datos.
Dado que cada fabricante provee diferentes estructuras de los datos provenientes de sus equipos, en
archivo de texto (*.csv), ser necesario aplicar una metodologa general consistente en los
siguientes pasos:
1. Estudiar la estructura de datos: Identificar encabezados, medatada y estructura de lista de
datos.
2. Obtener patrones nicos que les identifiquen: Encontrar cadenas de texto que estn
siempre en los archivos y sean nicos para cada tipo de equipo. Por ejemplo: encontrar las
unidades de medida o frases que identifiquen cada tipo de estructura.
3. Filtrar: Consiste en obtener, a partir de todo un conjunto de archivos, un subconjunto
correspondiente a los archivos deseados.

En consecuencia, este documento presenta la siguiente secuencia de trabajo:


Estudio, identificacin y filtro de las estructuras o formatos de archivos provenientes de
cada tipo de equipo.
Introduccin a las herramientas de programacin, uso de la terminal y aplicaciones.
Presentacin de un problema real y definicin de un orden de los archivos de datos.
Solucin del problema y aplicacin de los algoritmos.

Identificacin de patrones en archivos de datos.


En esta seccin se estudian los archivos .csv provistos por cada equipo de datos.

TD Solinst
Serial_number:
2025138
Project ID:
Location:
imilac
LEVEL
UNIT: m
Offset: 0,000000 m
TEMPERATURE
UNIT: C
Date;Time;ms;LEVEL;TEMPERATURE
2014/01/13;14:00:00;0;7,300;18,90
2014/01/13;14:30:00;0;7,335;21,00
2014/01/13;15:00:00;0;7,333;23,70
.
.
.

CDT Solinst
Serial_number:
1069254
Project ID:
MEL
Location:
LEVEL
UNIT: m
Offset: 0,000000 m
Altitude: 0,000000 m
Density: 1,000000 kg/L
TEMPERATURE
UNIT: Deg C
CONDUCTIVITY
UNIT: S/cm
Date;Time;ms;LEVEL;TEMPERATURE;CONDUCTIVITY
2013/10/04;01:00:00;0;-1,760;21,80;0,0
2013/10/04;01:30:00;0;-1,758;21,30;0,0
2013/10/04;02:00:00;0;-1,762;20,90;0,0
2013/10/04;02:30:00;0;-1,758;20,50;0,0
2013/10/04;03:00:00;0;-1,760;20,20;0,0
2013/10/04;03:30:00;0;-1,760;20,00;0,0
2013/10/04;04:00:00;0;-1,758;20,00;0,0
2013/10/04;04:30:00;0;-1,762;19,90;0,0
.
.
.

CTD Diver
Data file for DataLogger.
==============================================================================
COMPANY : <Company name>

COMP.STATUS: Do
DATE
: 21/01/2015
TIME
: 17:09:28
FILENAME :
C:\Users\osepulveda\Documents\proyectos\mel013\Enero2015\Sensores\AC\ctd_diver\CSV\sws_p5064_150121170927_P5064.CSV
CREATED BY : SWS Diver-Office 7.0.2.0
========================== BEGINNING OF DATA ==========================
[Logger settings]
Instrument type
=CTD-Diver=17
Status
=Started =0
Serial number
=..02-P5064 317.
Instrument number
=
=0
Location
=sws_p5064
Sample period
=M30
Sample method
=T
Number of channels
=3
[Channel 1]
Identification
=PRESSURE
Reference level
=400.000 cm
Range
=1750.000 cm
Master level
=1750
CMH2O
Altitude
=0
m
[Channel 2]
Identification
=TEMPERATURE
Reference level
=-20.000 C
Range
=100.000 C
[Channel 3]
Identification
Reference level
Range

=2: SPEC.COND.
=0.000 mS/cm
=120.000 mS/cm

[Series settings]
Serial number
=..02-P5064 317.
Instrument number
=
Location
=sws_p5064
Sample period
=00 00:30:00 0
Sample method
=T
Start date / time
=00:00:01 04-10-13
End date / time
=00:00:18 21-01-15
[Channel 1 from data header]
Identification
=PRESSURE
Reference level
=400.000 cm
Range
=1750.000 cm
Master level
=1750
CMH2O
Altitude
=0
m
[Channel 2 from data header]
Identification
=TEMPERATURE
Reference level
=-20.000 C
Range
=100.000 C
[Channel 3 from data header]
Identification
=2: SPEC.COND.
Reference level
=0.000 mS/cm
Range
=120.000 mS/cm
Date/time,Presin[cm],Temperatura[C],2:Cond.espec.[mS/cm]
2013/10/04 01:00:00,776.717,22.700,0.000
2013/10/04 01:30:00,777.067,21.970,0.000
.
.
.
END OF DATA FILE OF DATALOGGER FOR WINDOWS

CT Hobo
"Ttulo de trazado: 10370991"
"N.","Fecha Tiempo, GMT+00:00","Rango alto, S/cm (LGR S/N: 10370991, SEN S/N: 10370991)","Temp, C (LGR S/N: 10370991, SEN S/N:
10370991)","Acoplador separado (LGR S/N: 10370991)","Acoplador adjunto (LGR S/N: 10370991)","Host conectado (LGR S/N:

10370991)","Final de archivo (LGR S/N: 10370991)"


1,10/04/13 01:00:00 AM,0.0,21.44,Registrado,,,
2,10/04/13 01:30:00 AM,0.0,21.34,,,,
3,10/04/13 02:00:00 AM,0.0,21.03,,,,
.
.
.
18551,10/25/14 11:00:00 AM,18814.6,8.23,,,,
18552,10/25/14 11:30:00 AM,18804.5,8.29,,,,Registrado

T Hobo
"Ttulo de trazado: T2AC"
"N.","Fecha Tiempo, GMT-04:00","Temp, C (LGR S/N: 10399062, SEN S/N: 10399062)","Acoplador separado (LGR S/N: 10399062, SEN S/N:
10399062)","Acoplador adjunto (LGR S/N: 10399062, SEN S/N: 10399062)","Host conectado (LGR S/N: 10399062, SEN S/N:
10399062)","Parado (LGR S/N: 10399062, SEN S/N: 10399062)","Final de archivo (LGR S/N: 10399062, SEN S/N: 10399062)"
1,10/08/14 11:00:00 AM,5.693,Registrado,,,,
2,10/08/14 11:30:00 AM,4.792,,,,,
3,10/08/14 12:00:00 PM,4.636,,,,,
.
.
.
5043,01/21/15 12:00:00 PM,26.916,,,,,
5044,01/21/15 12:08:51 PM,,,Registrado,,,
5045,01/21/15 12:14:45 PM,,,,Registrado,,
5046,01/21/15 12:15:12 PM,,,,,Registrado,Registrado

TD Hobo
"Ttulo de trazado: yerba_loca_wl_4"
"N.","Mes,Dia,Ao Tiempo, GMT-03:00","Pres abs, psi (LGR S,N: 10473528, SEN S,N: 10473528, LBL: Presion)","Temp, F (LGR S,N:
10473528, SEN S,N: 10473528, LBL: Temperatura)","Acoplador separado (LGR S,N: 10473528)","Acoplador adjunto (LGR S,N:
10473528)","Host conectado (LGR S,N: 10473528)","Final de archivo (LGR S,N: 10473528)"
1,03,03,14 12:00:00 PM,13.5974,67.221,Registrado,,,
2,03,03,14 01:00:00 PM,13.5896,67.564,,,,
3,03,03,14 02:00:00 PM,13.5819,68.077,,,,
4,03,03,14 03:00:00 PM,13.5745,68.763,,,,
5,03,03,14 04:00:00 PM,13.5755,69.449,,,,
.
.
.
1710,05,13,14 05:00:00 PM,10.8532,53.100,,,,

1711,05,13,14 05:15:54 PM,,,,Registrado,Registrado,Registrado

Campbell
Rescatado desde el datalogger:
"TOA5","CR1000","CR1000","59206","CR1000.Std.26","CPU:yl1.CR1","33128","YL1"
"TIMESTAMP","RECORD","BattV_Avg","BattV_Max","BattV_Min","BattV","AirTC_Avg","AirTC_Max","AirTC_Min","AirTC","RH_Max","
RH_Min","RH","SlrkW_Avg","SlrkW_Max","SlrkW_Min","SlrkW","SlrMJ_Tot","WS_ms_Avg","WS_ms_Max","WS_ms_Min","WS_ms","WS_
ms_S_WVT","WindDir_D1_WVT","WindDir_SD1_WVT","WindDir"
"TS","RN","Volts","Volts","Volts","Volts","Deg C","Deg C","Deg C","Deg
C","%","%","%","kW/m^2","kW/m^2","kW/m^2","kW/m^2","MJ/m^2","meters/second","meters/second","meters/second","meters/second","meter
s/second","Deg","Deg","Degrees"
"","","Avg","Max","Min","Smp","Avg","Max","Min","Smp","Max","Min","Smp","Avg","Max","Min","Smp","Tot","Avg","Max","Min","Smp","W
Vc","WVc","WVc","Smp"
"2014-04-12 18:10:00",0,12.77,12.77,12.77,12.77,5.035,5.035,5.035,5.035,8.79,8.79,8.79,0.441,0.441,0.441,0.441,0.1321959,0,0,0,0,0,0,0,58.79
"2014-04-12
18:15:00",1,12.8,12.8,12.8,12.8,6.153,6.153,6.153,6.153,9.26,9.26,9.26,0.459,0.459,0.459,0.459,0.1376924,2.115,2.115,2.115,2.115,2.115,61.92,0,6
1.92
"2014-04-12
18:20:00",2,12.62,12.62,12.62,12.62,6.56,6.56,6.56,6.56,10.86,10.86,10.86,0.476,0.476,0.476,0.476,0.1427077,2.049,2.049,2.049,2.049,2.049,27.5
9,0.02,27.59
"2014-04-12
18:25:00",3,12.53,12.53,12.53,12.53,6.626,6.626,6.626,6.626,11.81,11.81,11.81,0.491,0.491,0.491,0.491,0.1474302,2.409,2.409,2.409,2.409,2.409,
53.25,0.014,53.25
"2014-04-12
18:30:00",4,12.46,12.46,12.46,12.46,6.693,6.693,6.693,6.693,15.61,15.61,15.61,0.508,0.508,0.508,0.508,0.1525131,2.803,2.803,2.803,2.803,2.803,
76.23,0,76.23
"2014-04-12
18:35:00",5,12.41,12.41,12.41,12.41,7.537,7.537,7.537,7.537,11.57,11.57,11.57,0.524,0.524,0.524,0.524,0.1570551,2.069,2.069,2.069,2.069,2.069,
19.95,0.02,19.95

"2014-04-12
18:40:00",6,12.38,12.38,12.38,12.38,8.35,8.35,8.35,8.35,7.837,7.837,7.837,0.54,0.54,0.54,0.54,0.1619581,1.628,1.628,1.628,1.628,1.628,42.49,0,4
2.49
"2014-04-12
18:45:00",7,12.35,12.35,12.35,12.35,9.22,9.22,9.22,9.22,12.21,12.21,12.21,0.555,0.555,0.555,0.555,0.1664971,0.558,0.558,0.558,0.558,0.558,12.6
5,0.014,12.65
"2014-04-12
18:50:00",8,12.34,12.34,12.34,12.34,9.29,9.29,9.29,9.29,9.7,9.7,9.7,0.57,0.57,0.57,0.57,0.1710351,1.254,1.254,1.254,1.254,1.254,20.62,0,20.62
"2014-04-12
18:55:00",9,12.31,12.31,12.31,12.31,9.35,9.35,9.35,9.35,5.867,5.867,5.867,0.585,0.585,0.585,0.585,0.1754501,1.147,1.147,1.147,1.147,1.147,13.3
9,0,13.39
"2014-04-12
19:00:00",10,12.3,12.3,12.3,12.3,10.12,10.12,10.12,10.12,4.917,4.917,4.917,0.6,0.6,0.6,0.6,0.1798637,0.456,0.456,0.456,0.456,0.456,67.32,0,67.32
"2014-04-12
19:05:00",11,12.29,12.29,12.29,12.29,10.83,10.83,10.83,10.83,4.917,4.917,4.917,0.614,0.614,0.614,0.614,0.1842208,0.155,0.155,0.155,0.155,0.15
5,187.3,0,187.3

Datos rescatados desde tarjeta o servidor FTP:


2013,354,11,10,11.97,0,15.19,15.3,15.06,6.815,6.815,6.51,0.977,0.978,0.975,48.85619,1.568,2.724,0,312.6
2013,354,11,15,11.93,0,15.43,15.84,15.06,6.204,6.679,5.492,0.986,0.991,0.979,295.6686,2.916,5.233,1.235,293.7
2013,354,11,25,11.94,0,15.89,16.01,15.77,5.73,5.798,5.594,1.017,1.019,1.017,30.51806,1.898,3.136,0,320.4
2013,354,11,30,12.08,0,16.14,16.92,15.6,5.323,6.035,5.187,1.028,1.041,1.016,308.2992,2.242,4.743,0.51,324.1
2013,354,11,35,12.09,0,16.84,17.09,16.55,5.594,5.933,5.086,1.048,1.053,1.037,314.2673,3.53,5.645,1.842,347.5
2013,354,11,40,11.9,0,16.97,17.16,16.76,5.255,5.526,5.052,1.059,1.067,1.052,317.7199,2.715,5.037,1.098,302.2
2013,354,11,45,12.05,0,16.58,16.99,16.27,5.356,5.526,5.017,0.881,1.086,0.035,242.1402,3.429,4.9,0,269.1
2013,354,11,50,12.05,0,16.76,17.09,16.37,5.187,5.424,4.814,0.928,1.104,0.046,278.519,3.918,6.292,2.254,300.3
2013,354,11,55,12.06,0,17.19,17.66,16.41,4.305,5.458,4.203,1.086,1.091,1.077,325.7198,3.574,5.194,2.097,0.529
2013,354,12,00,12.06,0,17.65,18.1,17.05,4.169,4.474,3.864,1.095,1.103,1.09,328.4023,2.495,4.155,0.843,323.3
2013,354,12,05,12.06,0,17.27,17.55,17.01,3.932,4.508,3.661,1.104,1.108,1.098,331.1573,2.833,4.665,0.764,293.6
2013,354,12,10,12.07,0,17.14,17.38,16.91,4.135,4.542,3.695,1.111,1.115,1.105,333.2574,3.134,5.449,0.568,286.8
2013,354,12,15,12.06,0,17.13,17.31,16.94,3.83,4.304,3.762,1.118,1.124,1.112,335.328,3.964,6.017,2.176,311.3
2013,354,12,20,11.94,0,17.44,17.92,17.14,3.66,3.999,3.423,1.126,1.131,1.121,337.6548,2.413,3.744,0.98,308.3

Equipo
TD Solinst
CTD Solinst
CTD Diver
CT Hobo
T Hobo
TD Hobo
Campbell 1
Campbell 2

#columnas
5
6
4
8
7
8
5
1

#formato data
F,T,Tt,DL,DT
F,T,Tt,DL,DT,DC
F T,DL,DT,DC
ID,F T,DC,DT,AS,AA,HC,EF
ID,F T,DT,AS,AA,HC,EF
ID,F T,DL,DT,AS,AA,HC,EF
Tstamp,ID;DDDDDD
Y,D,H,S,DDDDDDD...

#Linea 1 #line end #patrn c1


13 NR
Serial_number
17 NR
Serial_number
65 NR-1
CTD-Diver
3 NR
Ttulo de trazado
3 NR
Ttulo de trazado
NR
Ttulo de trazado
NR
CR1000
NR
-----

#patrn c2 #patrn c3
UNIT: C
LEVEL;TEMPERATURE
S/cm
LEVEL;TEMPERATURE;CONDUCTIVITY
mS/cm
BEGINNING OF DATA
S/cm
Acoplador
Temp, C
Acoplador
Pres abs, psi Acoplador
Volts
"TIMESTAMP","RECORD",
---------

Tabla resumen estructura de datos y patrones


F
T
Tt
DL
DT
DC
AS
AA
HC
EF
NR

Fecha mes/dia/ao o ao/mes/dia


Tiempo
milisec
Data Level
Data temperatura
Data Conductivida
Acoplador separado
Acoplador adjunto
Host Conectado
End file
Nmero de filas

Tabla glosario formato data


Se observa que es posible adquirir ciertas expresiones regulares dentro de cada formato provisto por
cada tipo de equipo de medicin, esto permite utilizar herramientas computacionales que nos
ayuden a ordenar y agrupar segn ciertos criterios determinados por nuestros requerimientos.

Herramientas computacionales para el procesamiento


de datos.
El procesamiento de los datos nos permite transformar una estructura en otra:
A ---> B
Obteniendo en B, a partir de A, solamente la informacin que se considera de importancia para
nuestro posterior anlisis.
Para esto es necesario comprender lo siguiente:

Los datos estn en archivos de texto.

Los datos tienen un encabezado que se descarta en B, pero nos sirve como metainformacin

Los datos estn ordenados temporalmente en columnas separador por coma

Archivo de texto + datos separados por coma: csv

Para cada dato existe un identificador nico que es la estampa de tiempo 'timestamp' que
puede estar representada de distintas formas, estas son determinadas por el fabricante o, si es
posible, por la configuracin del equipo.

Las acciones que nos interesa llevar a cabo para transformar A en B tienen que ver con:

Seleccionar columnas especficas

Operar matemticamente columnas

Transformar formatos de fechas

Filtrar filas que contengan o no cierta expresin regular

Cambiar cierta expresin regular por otra

Operar secuencialmente las acciones

Ordenar bajo un estandar los datos

ID
1
2
3
4
5
6

Accin
Seleccionar
Operar
Transformar
Filtrar
Operar Secuencialmente
Ordenar

Herramienta 1
awk
awk
date
grep
bash
awk

Herramienta 2
grep
bash
sed
awk
awk
ls

Tabla resumen accin-herramienta

Bash
Bash es un lenguaje de script nativo en la terminal o shell de linux. La terminal es un recuadro que
indica ubicacin en directorio con un promt o ndice que pestaea. En ella es posible ejecutar o
definir programas o scripts escritos en distintos lenguajes.

Ejemplo de terminal bash.


Las acciones en bash pueden entregar resultados en la misma terminal as como tambin enviar este
en un archivo, es posible tambien realizar secuencialmente operaciones sobre una misma cadena de
texto o archivo. Esto se puede realizar con las operaciones especiales de bash de entubado o pipping
con '|' (pleca), guardado de archivo '>' o '>>' (concatena textos) o lectura-asignacin desde archivocadena de texto '<'.

ID
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Comando
ls
dir
find
grep
cp
mv
rm
awk
sed
|
<
>
>>
cat
echo

Accin
Listar directorio con propiedades
Listar directorio con propiedades
Buscar en rbol de directorios
Buscar en cadena de texto
Copiar
Mover o renombrar
Borrar
Computar
Buscar y reemplazar
Entuba procesos
Lee archivo o asigna variable
Guarda en archivo
Concatena en archivo
Concatena caracteres
Imprime en terminal

Tabla acciones en bash

Entrega
Lista
Lista
Lista
Fila
Copia
Mueve
Borra
Archivo o lista
Cadena texto
Accin secuencial
Valor
Archivo o lista
Archivo o lista
en terminal
Texto

De esta manera, si:

estoy en un directorio

quiero listar los archivos *.csv que

contengan la expresin 'Diver'

Tendra que ejecutar en la terminal:

ls *.csv | xargs grep -m 1 Diver | awk -F: '{print $1}'


Que hace especficamente lo siguiente:
1. Listar todos los *.csv en el directorio
2. Seleccionar la primera fila de los archivos que tengan la palabra 'Diver'
3. Separar la cadena de texto por ':' y entregar la primera columnas
Obteniendo:
CTDDIVERAC.csv
Si deseo, adems, guardar la lista de los archivos 'Diver' entonces agrego '>divers.dat'
> ls *.csv | xargs grep -m 1 Diver | awk -F: '{print
$1}'>divers.dat
> ls
CT1AC.csv CT2AC.csv CTDDIVERAC.csv divers.dat
T2AC.csv
Al hacer 'ls' se muestra ahora el archivo de divers.dat
Si deseamos realizar una serie secuencial de operaciones, en que se definan algunas
variables y se ejecuten ciertos programas como envo de correo o tareas programadas, entonces se
puede escribir un archivo de texto '.sh' que contenga la serie de instrucciones, a esto de le llama un
'script'.
Por ejemplo, el envo de correos desde la terminal se puede programar as, utilizando una
cuenta gmail:
#!/bin/bash
hoy=$(date '+%j')
hace_una_semana=$hoy-7
semana=$(date '+%W')
year=$(date '+%Y')
# This needs heirloom-mailx
from="estacion.cea@gmail.com"
pass="pass_email"

name="Estacion CEA"
to="dpineda@cea.cl"
subject="Reporte datos boya Angostura semana
"$semana" ao "$year
body="Este es un envo automtico, semanal, de
los datos recibidos la ltima semana desde la
boya angostura"
datos_path='/home/estacion_angostura/public_ftp/d
atos/base/'
ruta_csv=$datos_path"reportes"
archivo=$ruta_csv"/data_"$semana"_"$year".csv"
echo $body |mailx -v -A gmail -s "Reporte datos
boya Angostura semana "$semana" ao "$year -a
$archivo $to

Vimos que en bash es posible utilizar la terminal como base para ejecucin de una lista
larga, muy larga, de acciones ya programadas. En el ejemplo de la bsqueda de 'Diver' realizamos 3
acciones al hilo, es decir, 3 acciones entubadas secuencialmente con '|'.
En ella ejecutamos tres acciones predefinidas: 'ls', 'grep' y 'awk'. Analicemos ms en detalle
en que consiste cada operacin.
Manual bash: http://linux.die.net/man/1/bash

Ls
Permite listar directorios y archivos contenidos dentro de la carpeta activa o en que te
encuentras ubicado.
Para una mayor granularidad se pueden aadir opciones que entregan de una forma
especfica los datos requeridos, se aade la forma de bsqueda con '-' y a continuacin la(s) letra(s)
que determina(n) la especifidad.
Un detalle al final del comando, un '\' puede cambiar absolutamente lo que entrega, veamos
en la terminal lo que resulta al ejecutar cada lnea:

El primer comando entrega solo las carpetas, el segundo todos los archivos. Si observamos
cada columna, entre ellas hay una separacin de un espacio, lo que permitira ejecutar el awk.
Para ms detalle de las opciones ver manual.
Manual ls: http://unixhelp.ed.ac.uk/CGI/man-cgi?ls

Grep
Grep realiza una bsqueda exhautiva de un patron de texto determinado dentro de un
archivo, adems acepta diferentes opciones que regulan la granularidad del resultado.
Por ejemplo en la siguiente cadena de texto, antipoema 'el hombre imaginario' de Nicanor
Parra.
El hombre imaginario
vive en una mansin imaginaria
rodeada de rboles imaginarios
a la orilla de un ro imaginario
De los muros que son imaginarios
penden antiguos cuadros imaginarios
irreparables grietas imaginarias
que representan hechos imaginarios
ocurridos en mundos imaginarios
en lugares y tiempos imaginarios
Todas las tardes tardes imaginarias
sube las escaleras imaginarias
y se asoma al balcn imaginario
a mirar el paisaje imaginario
que consiste en un valle imaginario
circundado de cerros imaginarios
Sombras imaginarias
vienen por el camino imaginario
entonando canciones imaginarias
a la muerte del sol imaginario
Y en las noches de luna imaginaria
suea con la mujer imaginaria
que le brind su amor imaginario
vuelve a sentir ese mismo dolor
ese mismo placer imaginario
y vuelve a palpitar
el corazn del hombre imaginario

Nos interesa lo siguiente:


1. Buscar las lneas que dicen 'imaginario'
> grep imaginario el_hombre_imaginario.txt
El hombre imaginario
rodeada de rboles imaginarios
a la orilla de un ro imaginario

De los muros que son imaginarios


penden antiguos cuadros imaginarios
que representan hechos imaginarios
ocurridos en mundos imaginarios
en lugares y tiempos imaginarios
y se asoma al balcn imaginario
a mirar el paisaje imaginario
que consiste en un valle imaginario
circundado de cerros imaginarios
vienen por el camino imaginario
a la muerte del sol imaginario
que le brind su amor imaginario
ese mismo placer imaginario
el corazn del hombre imaginario
> grep imaginario$ el_hombre_imaginario.txt //'solamente' imaginario
El hombre imaginario
a la orilla de un ro imaginario
y se asoma al balcn imaginario
a mirar el paisaje imaginario
que consiste en un valle imaginario
vienen por el camino imaginario
a la muerte del sol imaginario
que le brind su amor imaginario
ese mismo placer imaginario
2. Buscar lneas que dicen 'amor'
> grep amor el_hombre_imaginario.txt
que le brind su amor imaginario
3. Lneas que terminan con 'imaginarias'
> grep imaginarias el_hombre_imaginario.txt
irreparables grietas imaginarias
Todas las tardes tardes imaginarias
sube las escaleras imaginarias
Sombras imaginarias
entonando canciones imaginarias
4. Mostrar el poema, excepto en donde dice 'imaginario'
> grep -v imaginario el_hombre_imaginario.txt
vive en una mansin imaginaria
irreparables grietas imaginarias
Todas las tardes tardes imaginarias

sube las escaleras imaginarias


Sombras imaginarias
entonando canciones imaginarias
Y en las noches de luna imaginaria
suea con la mujer imaginaria
vuelve a sentir ese mismo dolor
y vuelve a palpitar
Si observamos bien, para una ajuste preciso de la bsqueda es de muy utilidad la forma de
generar las cadenas a buscar llamadas 'expresiones regulares' o 'regular expresions' (Libro 2)
Manual grep: http://unixhelp.ed.ac.uk/CGI/man-cgi?grep

Sed
Permite buscar y reemplazar cadenas de texto dentro de archivo u otras cadenas de texto, dentro de
sus posibilidades est el uso de expresiones regulares y distintas opciones que potencian el uso de la
terminal.
sed -e 's/A/B/g' file

Presenta el cambio de expresion A por B en el


archivo

sed -i 's/A/B/g' file

Cambia A por B en el archivo

echo 'Punta Negra/' | sed 's/ /\\ /g'

Cambia el nombre o string pasando el espacio a


'\ ', muy til cuando se trabaja con carpetas que
tienen espacio en su nombre

Manual sed: http://unixhelp.ed.ac.uk/CGI/man-cgi?sed

Awk
Es un lenguaje de programacin [wiki]que se ejecuta en la terminal, que permite procesar archivos
con tablas de datos. El sistema awk interpreta cada entrada de lnea como un dato con columnas
separadas por un carcter [,;:-|etc] en que es posible seleccionar estas, siendo posible operarlas
matemticamente, como cadenas de caracteres, uso de arreglos, adems de disponer de una serie de
variables de estado que nos permite rescatar los metadatos de la operacin, como: NF nmero de
columnas, FNR fila actual, NR, cantidad de files, etc.
La gran potencia que tiene es que, mediante una rutina o 'script' de unas lneas, seleccionando o
filtrando adecuadamente en conjunto con las herramientas anteriores, permite un procesamiento de
distintos datos en grandes cantidades mediante una operacin. En conclusin, un ahorro de tiempo
gracias a la capacidad de abstraccin que es posible implementar.

Usos frecuentes:
awk -F, '{print $0}' file

Mostrar todas las filas de un archivo

awk -F, '{print $2 , $5}' file

Mostrar las columnas 3 y 5 de todas las filas de


un archivo

awk -F, '{print substr($0,index($0,3))}' file

Mostrar todas las filas, pero desde la 4 columna

awk -F, '{


ruta=$1;
n=split(ruta,nombres,/);
filen=nombres[n];
madre=nombres[n-1];
print madre , filen}' file

Un archivo que tenga en columna 1 los nombres


de ruta, se rescata el archivo de cada ruta y la
carpeta madre, se imprime.

awk -F, '{print $0}' file>file2

Se guarda lo que se muestra en file2

awk -F, '(FNR>=50){print $0}' file

Solo muestra las lneas cuando la lectura indica


que est en lnea 50

awk -F, '(FNR==NR){print FILENAME;next} Permite leer dos archivos, imprimir los nombres
{print FILENAME}' file file2
de ambos en cada lnea. Es til para comparar
distintas tablas y analizar la existencia de
valores similares. Un buen uso es la asignacin
de arreglos en la primera etapa que se puedan
llamar en la segunda.
Manual awk: http://www.manpagez.com/man/1/awk/

Un problema real
El proyecto 'MELXIII' considera un estudio de los salares de la 2regin de Antofagasta.
Para esto se planifica la instalacin de equipos sensores que midan la meteorologa, nivel y calidad
del agua. Para esto se cotizan los siguientes equipos:

Estacin meteorolgica Campbell {T,RH,Wind,Rain,SrlRad} enva datos por telemetra

Sensor Hobo Temperatura autnomo

Sensor Hobo Conductividad Temperatura autnomo

Sensor Solinst Temperatura Nivel autnomo

Sensor Solins Temperatura Nivel Conductividad autnomo

Sensor Diver Conductividad, Nivel, Temperatura autnomo

La instalacin de los equipos se hace en terreno previa programacin. Los datos a tener en
cuenta, para todos son:

Posicin UTM de instalacin

Lectores de sensores pticos

Formato del archivo que entrega cada equipo de manera nativa:


*.dat: Campbell es un formato texto csv
*.hobo: Hobo exporta a csv
*.xle: Solinst es un formato xml y se exporta a csv
*.csv: Diver es csv

Montaje, si est sobre o en el agua, si est amarrado con alambre, con o sin estaca, etc.

En la imagen del mapa se observa la ubicacin de los sensores en el salar de Aguas


Calientes. En general, los sensores se ubican en las cercanas de los afluentes y las estaciones en
lugares seguros en que sea posible orientar la antena satelital.
En cada campaa, usualmente, se realiza un Cronograma en que se recogen los datos
capturados por los sensores y estaciones. Se guarda un archivo en formato nativo y se exporta a csv
si corresponde.
La estructura de carpeta es Campaa>>Lugar>>archivo.{nativo y csv}

Definiendo un orden para los archivos de datos.


Al acumular las campaas de un intervalo de tiempo, sea un ao o ms, sera necesario otra
forma de plantear la estructura de carpetas. Una propuesta interesante y de utilidad consiste,
considerando el uso de solo csv, en:
Lugar_Padre>>Lugar_Hijo>>#Campaa>>archivo.csv
Lo que resulta, para este caso en, al ejecutar 'tree -d':
Aguas Calientes
01
03
04
Imilac
01
02
03
04
La Brava
01

02
03
04
La Punta
01
02
04
Lejia
01
02
04
Pajonales
01
03
04
post_csv
ENDCSVs
wheader
old
pre_correccion_dt
Punta Negra
V3
01
02
03
04
VCL2
01
02
03
04
VCL3
01
02
03
04
VCL4

01

02

03

04
Tambo
Tara
01
02
03
04

Solucin del problema


Tenemos como desafo lo siguientes

Lograr un formato o estructura estndar de datos

Identificar patrones en csv que permitan identificar cada tipo

Unir los datos de diversas campaas

Mantener un encabezado que indique nombres de columnas.

Guardar en CSVs

Aplicacin de los algoritmos.


Manualmente seleccionamos y ubicamos los archivos en la estructura de carpetas.
Listamos los archivos csv y guardamos en un archivo:
find -iname "*.csv" > CSVs.dat
Se estudia el archivo y se copia en un archivo CSVs_final.dat que contenga las correcciones
de nombre a realizar, por ejemplo: no queremos nombres con '_'.
grep "_" CSVs.dat > sub_CSV.dat
Se hace una unin de ambos archivos con 'paste', que junta columna a columna.
paste -d, sub_CSV.dat post_CSV.dat > fileconvert.dat
Se cambian los espacios por '\ '
sed -i s'\ \\ \'g. fileconvert.dat
Y se cambian los nombres usando awk:
awk -F, '{
convert="mv "$1" "$2;
convert | getline d;
print d;
close(convert)
}' fileconvert.dat
Una vez que tenemos ordenados y corregidos los archivos, listamos los archivos csv, que
seran en esta etapa las rutas de cada sensor, a las carpetas con espacio en su nombre se le debe
reemplazar por '\ '.

find -iname .csv | sed 's/ /\\ /g' > lista_sensores.dat


A continuacin se realiza la identificacin del tipo de sensor asociado a cada archivo, con los
parmetros principales de control, obtenidos a partir de la metadata. Cada lectura acumula los datos
referenciales en el mismo archivo (>>archivo).

#!/bin/bash
# PathSensor
# HoboT
# HoboCT
# SolinstTD
# SoinstCTD
# DiverCTD

-> ID Tipo
-> 1
-> 2
-> 3
-> 4
-> 5

->Cols -> LineStart ->LineEND ->Head


->7 ->3 ->0 ->Encabezado
->8 ->3 ->0 ->""
->5 ->13 ->0 ->""
->6 ->17 ->0 ->""
->4 ->65 ->0 ->""

#Listar los HOBOT


find -iname "*.csv" |
sed 's/ /\\ /g'|
xargs grep "Temp" |
grep -v S/cm |
grep -v S,cm |
awk -F: '{
print $1",1,8,3,0,Timestamp;T[degC]"
}'>>id_sens.dat
#Listar los HOBOCT
find -iname "*.csv" |
sed 's/ /\\ /g'|
xargs grep "S/cm" |
grep GMT |
awk -F: '{
print $1",2,9,3,0,Timestamp;T [degC];Cond [uS/m]"
}'>>id_sens.dat
#Listar SolinstTD
find -iname "*.csv" |
sed 's/ /\\ /g'|
xargs grep "LEVEL"."TEMPERATURE" |
grep -v CONDUCTIVITY |
awk -F: '{print $1",3,5,14,0,Timestamp;T [degC];Level [m]"
}'>>id_sens.dat
#Listar SolinstCTD
find -iname "*.csv" |
sed 's/ /\\ /g'|
xargs grep -m 1 "S/cm" |
grep UNIT| awk -F: '{
print $1",4,6,18,0,Timestamp;T [degC];Cond [uS/m];Level [m]"
}'>>id_sens.dat
#Listar DiverCTD
find -iname "*.csv" |
sed 's/ /\\ /g'|
xargs grep -m 1 "Diver" |
awk -F: '{print $1",5,4,66,1,Timestamp;T [degC];Cond [uS/m];Level [m]"

}'>>id_sens.dat
A continuacin se ejecuta el programa que efectua la estandariacin de los datos a una forma
utime,medidas, por lo que puede considerarse el ncleo del algoritmo.
#!/bin/bash
#Este codigo pasa las columnas de tiempo a una forma estandar entero unix timestamp
#segn cada 'tipo' de sensor se selecciona una forma de pasar los valores de fechatiempoatimestamp
#se lee archivo de referencia y se asignan los valores de filtrado
#si la lnea de entrada xargs que es un path, coincide con la actual del arreglo ruta
#entonces
#es un Hobo T | ID,F T,DT,AS,AA,HC,EF
#Es un Hobo CT | ID,F T,DC,DT,AS,AA,HC,EF
#Es un Solinst TD | F,T,Tt,DL,DT
#Es un Solinst CTD | F,T,Tt,DL,DT,DC
#Es un Diver CTD | F T,DL,DT,DL-> dividir en 100 ----DC-> multiplicar por 1000
find -iname "*.csv" | sed 's/ /\\ /g'| xargs -I input awk -F, 'FNR==NR{
++i;
n=split($1,path,"/");
ruta[i]=$1;
file[i]=toupper(path[n]);
temp[i]=path[n-1];
place[i]=path[n-2];
id[i]=$2;
cols[i]=$3;
lstart[i]=$4;
lend[i]=$5;
head[i]=$6;
next;}
{
FS=",";
k=0;
for (j=1;j<=i;j++)
{
if(FILENAME==ruta[j])
k=j;
};
id2=id[k];
cols2=cols[k];
lstart2=lstart[k];
lend2=lend[k];
head2=head[k];
OFS=";";
n2=split(FILENAME,path2,"/");
file2=toupper(path2[n2]);
temp2=path2[n2-1];
place2=path2[n2-2];
if(FILENAME==ruta[k]){
if(NF==cols2){

switch(id2)
{
case 1:
split($2,fecha,"/");
split(fecha[3],year_time," ");
mes=(+fecha[1]"/");
dia=(+fecha[2]"/");
year=(+year_time[1]"");
time=year_time[2]" "year_time[3];
postfecha="\""mes""dia"/"+year" "time"\"";
fecha_s="date --date="postfecha" +%s";
medidas=$3;
if(medidas!=NUL){ tiene_valor=1;}
break;
case 2:
split($2,fecha,"/");
mes=(+fecha[1]"/");
dia=(+fecha[2]"/");
split(fecha[3],year_time," ");
year=(+year_time[1]"/");
time=year_time[2]" "year_time[3];
postfecha="\""mes""dia"/"+year" "time"\"";
fecha_s="date --date="postfecha" +%s";
medidas=$4","$3;
if($4!=NUL) {tiene_valor=1;}
break;
case 3:
prefecha=$1" "$2;
split(prefecha,fecha_tiempo," ");
fecha=fecha_tiempo[1];
tiempo=fecha_tiempo[2];
split(fecha,fechas,"/");
postfecha=(+fechas[2]"/")(+fechas[3]"/")"/"+fechas[1]" "tiempo;
fecha_s="date --date=\""postfecha"\" +%s";
medidas=$5","$4;
if($5!=NUL) {tiene_valor=1;}
break;
case 4:
prefecha=$1" "$2;
split(prefecha,fecha_tiempo," ");
fecha=fecha_tiempo[1];
tiempo=fecha_tiempo[2];
split(fecha,fechas,"/");
postfecha=(+fechas[2]"/")(+fechas[3]"/")"/"+fechas[1]" "tiempo;
fecha_s="date --date=\""postfecha"\" +%s";
medidas=$5","$4","$6;
if($5!=NUL) {tiene_valor=1;}
break;
case 5:
prefecha=$1;
split(prefecha,fecha_tiempo," ");
fecha=fecha_tiempo[1];

tiempo=fecha_tiempo[2];
split(fecha,fechas,"/");
postfecha=(+fechas[2]"/")(+fechas[3]"/")"/"+fechas[1]" "tiempo;
fecha_s="date --date=\""postfecha"\" +%s";
medidas=$3","$2/100","$4*1000;
if($3!=NUL) {tiene_valor=0;}
break;
default:
fecha_s="date +%s";
medidas="0,0,0";
if(medidas!=NUL) tiene_valor=1;
}
fecha_s | getline utime;
if (FNR==100){
print FILENAME","postfecha","utime",Tiempo:"time;
}
};
if (FNR>=lstart2 && FNR<=NR-lend2 && tiene_valor==1)
{
print utime","medidas >>"post_csv/"temp2"_"file2;
}
else if(NR==1)
{
print head2 >>"post_csv/"temp2"_"file2;
};
close(fecha_s);}
}' id_sens.dat input

El algoritmo hace dos cosas de importancia:

Convierte los distintos formatos de fecha en un valor Unix Timestamp

Asocia a cada archivo la temporada de rescate y lo guarda en post_csv


Es de observar que la extensin entregada es CSV en maysculas.

El paso siguiente es aplicar una ltima correccin a los datos, que consiste en el
desplazamiento por uso horario, que se determina al momento de programar cada sensor y,
usualmente, es un detalle que se pasa por alto; para hacerlo se debe:

Tener una lista de los archivos y su desplazamiento horario (en columnas nombre,dt). Los
datos de importancia son aqu:
Nombre archivo
Temporada de recoleccin

Leer los nuevos archivos *.CSV y filtrar segn corresponda.


Para realizar esta tarea es posible ejecutar el siguiente script:

#!/bin/bash
# Script que permite ajustar el timestamp a GMT 0
ls -lp *.CSV| awk '{print $9}'| xargs -I inputcsv awk -F, '(FNR==NR){
++i;
path=$1;
n=split(path,ruta,"/");
file[i]=toupper(ruta[n]);
temporada[i]=ruta[n-1];
dt[i]=$2*60*60;
next
}
{
archivo=FILENAME;
n2=split(archivo,temp_archivo,"_");
temp2=temp_archivo[1];
nombre_archivo=temp_archivo[2];
k=0;
for (j=1;j<=i;j++)
{
if(nombre_archivo==file[j] && temp2==temporada[j])
k=j;
};
deltatiempo=dt[k];
utime=$1;
post_utime=utime-deltatiempo;
if(k>0){
print post_utime","substr($0, index($0,$2))>>"pre_correccion_dt/"archivo;
}
}' hobo_dt.dat inputcsv
Una operacin de reemplazo de los nuevos por los viejos:
ls -lp *.CSV| awk '{print $9}'| xargs -I input mv "../"input ../old/
mv *.CSV ../
Uno de los ltimos pasos consiste en concatenar los archivos del mismo sensor:
#!/bin/bash
ls -lp *.CSV| awk '{print $9}'| xargs -I input awk -F, '(FNR==NR){
FS="/";
++i;
file[i]=toupper($NF);
temp[i]=$(NF-1);
next}
{
archivo=FILENAME;
n=split(archivo,temp_archivo,"_");
temp2=temp_archivo[1];
nombre_archivo=temp_archivo[2];

k=0;
for (j=1;j<=i;j++)
{
if(nombre_archivo==file[j])
k=j;
};
if(k>0){
print $0>>"ENDCSVs/"nombre_archivo;
}
}' listacsv.dat input
Para poner el encabezado, se ocupa el archivo de identidad de sensores corregido a lo que se
necesita:
awk -F, '{
path=$1;n=split(path,nombrefile,"/");
file=toupper(nombrefile[n]);
print file","$6
}' id_sens.dat > postidsens.dat
sort -u postidsens.dat > ident_sens.dat
Y, por ltimo, se aade el encabezado correspondiente a cada tipo de archivo:
ls -lp *.CSV| awk '{print $9}' | xargs -I input awk -F, '(FNR==NR){
path=$1;
n=split(path,names,"/");
++i;
file[i]=toupper(names[n]);
header[i]=$2;
}
{
archivo=FILENAME;
k=0;
for (j=1;j<=i;j++)
{
if(archivo==file[j]){
if (FNR==1){print header[j]>>"wheader/"archivo;}
print $0>>"wheader/"archivo;}
};
}' ident_sens.dat input
De esta forma se obtienen los datos con el formato siguiente:
Timestamp;T [degC];Cond [uS/m]
1380693600,20.26,0.0
1380695400,19.93,0.0
1380697200,19.81,0.0

1380699000,19.66,0.0
1380700800,19.54,0.0
1380702600,19.41,0.0
1380704400,19.29,0.0
1380706200,19.20,0.0
1380708000,19.08,0.0
1380709800,18.97,0.0
Para cerrar el proceso, se filtran las lneas repetidas y se descartan las que registran eventos
de conexin (no tienen dato):
#Ordena segun columna 1 en forma numrica con separador , en que la salida sea la misma entrada
ls -l *.CSV | awk '{print $9}'|xargs -I input sort -k1n -u -t"," -o input input
#limpiar lneas sin valor al final: registro u otro caso
ls -l *.CSV | awk '{print $9}'|xargs -I input sed -i '/,,/d' input

A continuacin un diagrama que resume el proceso usual para trabajar con los datos.

Unir

Transformar
Identificar

Dataset
Graficar
Ajustar

Estructurar

Analizar
Decidir

Vous aimerez peut-être aussi