2010-01-23 11 views
15

Tengo un archivo que contiene muchas columnas de texto, incluida una marca de tiempo en las líneas de Fri Jan 02 18:23 y necesito convertir esa fecha en formato MM/DD/YYYY HH:MM.Convertir fechas en AWK

He intentado utilizar la herramienta estándar `date 'con awk getline para hacer la conversión, pero no puedo entender cómo pasar los campos al comando' date 'en el formato que espera (citado con "o 's,) como getline necesidades de la cadena de comando entre comillas también.

Algo así como "date -d '$1 $2 $3 $4' +'%D %H:%M'" | getline var

Ahora que lo pienso, creo que lo que realmente estoy preguntando es cómo integrar las variables awk en una cadena

Respuesta

17

puede intentarlo. Suponiendo que la fecha que ha especificado está en el archivo

awk ' 
{ 
    cmd ="date \"+%m/%d/%Y %H:%M\" -d \""$1" "$2" "$3" "$4"\"" 
    cmd | getline var 
    print var 
    close(cmd) 
}' file 

salida

$ ./shell.sh 
01/02/2010 18:23 

y si no lo está usando herramientas de GNU, como si se encuentra en Solaris, por ejemplo, utilizar nawk

nawk 'BEGIN{ 
    m=split("Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec",d,"|") 
    for(o=1;o<=m;o++){ 
     months[d[o]]=sprintf("%02d",o) 
    } 
    cmd="date +%Y" 
    cmd|getline yr 
    close(cmd) 
} 
{ 
    day=$3 
    mth=months[$2] 
    print mth"/"day"/"yr" "$4 
} ' file 
+0

Confiar en una bandera de 'fecha' no estándar y luego una tubería no es tan legítimo como llamar a una secuencia de comandos de Perl en línea para hacer el trabajo. – gary

+0

@gary: un poco duro. Si tiene herramientas gnu, ¿por qué no utilizar sus capacidades? –

+0

@glenn: Tal vez ghostdog tiene gnu, pero OP preguntaba por awk. Y en lugar de ejecutar un comando externo (fecha) para cada línea, realmente debería haber pensado más. – gary

18

Si está utilizando gawk, se no necesita el externo date que puede ser expensive para llamar repetidamente:

awk ' 
BEGIN{ 
    m=split("Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec",d,"|") 
    for(o=1;o<=m;o++){ 
     months[d[o]]=sprintf("%02d",o) 
    } 
format = "%m/%d/%Y %H:%M" 
} 
{ 
split($4,time,":") 
date = (strftime("%Y") " " months[$2] " " $3 " " time[1] " " time[2] " 0") 
print strftime(format, mktime(date)) 
}' 

Gracias a ghostdog74 para la matriz de meses de this answer.

+1

+1 por dejar que awk haga todo el trabajo. Requiere gawk para 'strftime()' –

+0

"Si está usando gawk ...". Gracias por el +1. –