Не могли бы вы попробовать следующее.
awk '{val=$2;val2=$3;gsub(/-/," ",val);gsub(/:/," ",val2);print $1,mktime(val OFS val2)}' Input_file
ИЛИ (без использования переменных для $2
или $3
попробуйте:
awk '{gsub(/-/," ",$2);gsub(/:/," ",$3);print $1,mktime($2 OFS $3)}' Input_file
Универсальное решение: Если вы не хотите жестко кодировать поля для даты и времени, попробуйте выполнить следующее.
awk '
match($0,/[0-9]+-[0-9]+-[0-9+ [0-9]+:[0-9]+:[0-9]+/){
val=substr($0,RSTART,RLENGTH)
gsub(/:|-/," ",val)
print $1,mktime(val)
}
' Input_file
Исправление попытки OP: Хотя это должно быть сделано с помощью одного awk
и т. Д., Просто исправляя здесь свой код.
sed 's/[-:]/ /g' Input_file |awk '{print $1, mktime($2 FS $3 FS $4 FS $5 FS $6 FS $7)}'
С man awk
о mktime
:
mktime (datepec) Превратить datepec в метку времени той же формы, что и systime (), и вернуть результат. Datepec - это строка в формате YYYY MM DD HHMM SS [DST]. Содержимое строки состоит из шести или семи чисел, представляющих соответственно полный год, включая столетие, месяц от 1 до 12, день месяца от 1 до 31, час дня от 0 до 23минуты от 0 до 59, секунды от 0 до 60 и необязательный флаг перехода на летнее время. Значения этих чисел не должные в указанных пределах;например, час -1 означает 1 час до полуночи.Предполагается, что в исходном нулевом григорианском календаре год 0 предшествует году 1, а год -1 предшествует году 0. Предполагается, что время находится в местном часовом поясе.Если флаг перехода на летнее время положительный, предполагается, что это летнее время;если ноль, время считается стандартным временем;и если оно отрицательное (по умолчанию), mktime () пытается определить, действует ли переход на летнее время в течение указанного времени.Если datepec не содержит достаточного количества элементов или если результирующее время выходит за пределы диапазона, mktime () возвращает -1.