2011-11-25 25 views
6

Estoy intentando crear un script para convertir dos columnas en un archivo .csv que son fecha y hora en marcas de tiempo de Unix. Así que necesito obtener la columna de fecha y hora de cada fila, convertirla e insertarla en una columna adicional al final que contenga la marca de tiempo.Script de Bash para convertir una columna de fecha y hora en unix timestamp en .csv

¿Alguien podría ayudarme? Hasta ahora he descubierto el comando Unix para convertir cualquier hacerle hora y la fecha a unixstamp:

date -d "2011/11/25 10:00:00" "+%s" 
1322215200 

no tengo experiencia con bash scripting podría alguien me empezó?

ejemplos de mis columnas y filas:

Columns: Date, Time, 
Row 1: 25/10/2011, 10:54:36, 
Row 2: 25/10/2011, 11:15:17, 
Row 3: 26/10/2011, 01:04:39, 

Muchas gracias de antemano!

+0

¿Puede incluir algunas filas de ejemplo de su archivo csv? – ajreal

+0

Claro, se lo ha puesto en duda, aplausos –

+0

Conversión solamente sin parte de análisis: http://stackoverflow.com/questions/10990949/convert-date-time-string-to-unix-timestamp-in-bash-command –

Respuesta

1

esto debería hacer el trabajo:

awk 'BEGIN{FS=OFS=", "}{t=$1" "$2; "date -d \""t"\" +%s"|getline d; print $1,$2,d}' yourCSV.csv 

nota

usted no dio ningún ejemplo. y mencionó csv, por lo que supongo que el separador de columna en su archivo debe ser "de coma".

prueba

kent$ echo "2011/11/25, 10:00:00"|awk 'BEGIN{FS=OFS=", "}{t=$1" "$2; "date -d \""t"\" +%s"|getline d; print $1,$2,d}' 
2011/11/25, 10:00:00, 1322211600 
7

Usted no proporciona un extracto de su archivo csv, así que estoy usando esta:

[foo.csv] 
2011/11/25;12:00:00 
2010/11/25;13:00:00 
2009/11/25;19:00:00 

He aquí una manera de resolver su problema:

$ cat foo.csv | while read line ; do echo $line\;$(date -d "${line//;/ }" "+%s") ; done 
2011/11/25;12:00:00;1322218800 
2010/11/25;13:00:00;1290686400 
2009/11/25;19:00:00;1259172000 

(EDITAR: Se ha eliminado una variable uneccessary)

(Edit2:.. Altered el comando date por lo que el script funciona en realidad)

+0

Gracias para su ayuda: He puesto esto en un script de shell de la siguiente manera: #!/ltd/bin/bash cat myfile.csv | mientras lee la línea; do t = $ (echo $ line | tr ',' ''); echo $ line \; $ (date -d "$ t" "+% s"); hecho Obtuve la opción de error ilegal --d cuando lo ejecuté? También estoy en lo correcto al asumir que necesito reemplazar ';' con ',' ya que tengo un archivo separado por coma no semi colon sperated? –

+0

Ejecútelo como un oneliner y pruébelo antes de ponerlo en un script-file para ver si le funciona. Y sí, necesita cambiar '';' 'a'', '' si usa un archivo csv separado por punto y coma. – bos

+1

@bos puede acortar la parte de bucle del ciclo while con 'echo $ {line} \; $ (date -d" $ {line //; /} "+ '% s');' No hay necesidad de eco y tr para obtener la cadena de fecha correcta. Entonces esto podría hacerse en el lugar. – f4m8

2

Ahora dos imporvements:

Primero: No hay necesidad de foo.csv gato, simplemente transmita por < foo.csv al ciclo while.

Segundo: No es necesario para echo & tr para crear el formato de fecha de cadena. Simplemente use el patrón interno bash y sustitúyalo y hágalo en el lugar

while read line ; do echo ${line}\;$(date -d "${line//;/ }" +'%s'); done < foo.csv 
Cuestiones relacionadas