2010-01-23 3 views
15

У меня есть файл, содержащий много столбцов текста, включая метку времени по линиям Fri Jan 02 18:23, и мне нужно преобразовать эту дату в формат MM/DD/YYYY HH:MM.Преобразование даты в AWK

Я пытаюсь использовать стандартный инструмент «date» с awk getline для преобразования, но я не могу понять, как передать поля в команду «date» в ожидаемом формате (цитируется с "или«с,) как GetLine нуждается в командной строке, заключенный в кавычки тоже.

что-то вроде "date -d '$1 $2 $3 $4' +'%D %H:%M'" | getline var

Теперь, когда я думаю об этом, я думаю, что я действительно спрашиваю, как вставлять AWK переменные в строку.

ответ

17

вы можете попробовать это. Предполагая, что указанная вами дата указана в файле

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

выход

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

и если вы не используете инструменты GNU, как если вы находитесь в Solaris, например, использовать 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

Опираясь на нестандартный флаг «дата», а затем труба даже не является законной, как вызов встроенного скрипта Perl для выполнения этой работы. – gary

+0

@gary: немного суровый. Если у него есть инструменты gnu, почему бы не использовать их возможности? –

+0

@glenn: Возможно, у ghostdog есть gnu, но OP спрашивал об awk. И вместо того, чтобы выполнять внешнюю команду (дату) для каждой строки, он действительно должен был подумать больше. – gary

18

Если вы используете Gawk, вы не требуется внешний date, который может быть expensive для повторного вызова:

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

ghostdog74 для массива месяцев от this answer.

+1

+1 для того, чтобы позволить awk выполнять всю работу. Требуется gawk для 'strftime()' –

+0

«Если вы используете gawk ...». Спасибо за +1. –

Смежные вопросы