Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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.
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:
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,,,,
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
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...
#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",
---------
Los datos tienen un encabezado que se descarta en B, pero nos sirve como metainformacin
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:
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
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.
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
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
estoy en un directorio
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
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
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
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:
La instalacin de los equipos se hace en terreno previa programacin. Los datos a tener en
cuenta, para todos son:
Montaje, si est sobre o en el agua, si est amarrado con alambre, con o sin estaca, etc.
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
Guardar en CSVs
#!/bin/bash
# PathSensor
# HoboT
# HoboCT
# SolinstTD
# SoinstCTD
# DiverCTD
-> ID Tipo
-> 1
-> 2
-> 3
-> 4
-> 5
}'>>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 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
#!/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