У меня есть файл, содержащий много столбцов текста, включая метку времени вроде 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 переменные в строку.
Вы можете попробовать это. Предполагая, что только указанная вами дата находится в файле
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
Если вы используете 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 на массив месяцев из Это ответа .