2010-01-23 4 views
15

J'ai un fichier contenant plusieurs colonnes de texte, y compris un horodatage le long des lignes de Fri Jan 02 18:23 et j'ai besoin de convertir cette date en format MM/DD/YYYY HH:MM.Conversion des dates en AWK

J'ai essayé d'utiliser l'outil `date 'standard avec awk getline pour faire la conversion, mais je n'arrive pas à comprendre comment passer les champs dans la commande' date 'dans le format attendu (cité avec "ou « s,) comme getline a besoin de la chaîne de commande entre guillemets aussi.

Quelque chose comme "date -d '$1 $2 $3 $4' +'%D %H:%M'" | getline var

maintenant que je pense, je suppose que ce que je demande vraiment est de savoir comment intégrer les variables awk dans une chaîne

Répondre

17

vous pouvez essayer ceci en supposant que la date que vous avez spécifiée est dans le fichier

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

sortie

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

et si vous n'utilisez pas des outils GNU, comme si vous êtes dans Solaris par exemple, utiliser 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

S'appuyer sur un indicateur 'date' non standard, puis sur un canal, n'est même pas aussi légitime que d'appeler un script Perl en ligne pour effectuer le travail. – gary

+0

@gary: un peu dur. S'il a des outils GNU, pourquoi ne pas utiliser leurs capacités? –

+0

@glenn: Peut-être que ghostdog a gnu, mais OP posait des questions sur awk. Et plutôt que d'exécuter une commande externe (date) pour chaque ligne, il aurait vraiment dû y penser davantage. – gary

18

Si vous utilisez gawk, vous n'a pas besoin du date externe qui peut être expensive pour appeler à plusieurs reprises:

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)) 
}' 

Merci à ghostdog74 pour le tableau de mois de this answer.

+1

+1 pour laisser faire le travail. Requiert gawk pour 'strftime()' –

+0

"Si vous utilisez gawk ...". Merci pour le +1. –