Преобразование дат в AWK

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

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

Что-то как "date -d '$1 $2 $3 $4' +'%D %H:%M'" | getline var

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

17
задан Mathieu 11 February 2016 в 14:44
поделиться

2 ответа

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

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
17
ответ дан 30 November 2019 в 11:32
поделиться

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

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 на массив месяцев из Это ответа .

21
ответ дан 30 November 2019 в 11:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: