Как обрабатывать функции времени в awk в потоке - PullRequest
1 голос
/ 20 сентября 2019

Существует файл test.txt

ABCDEF 2019-09-16 02:45:49
ABCDEF 2019-09-16 02:26:27
ABCDEF 2019-09-16 02:15:23

Нужен ответ как со временем Unix:

ABCDEF 1568583949
ABCDEF 1568582787
ABCDEF 1568582123

Я использую этот код AWK.

cat test.txt|sed 's/[-:]/ /g'|awk '{print $1, mktime("$2,$3,$4,$5,$6,$7")}'

Но у меня неправильный ответ.Как я могу это исправить?

ABCDEF -1
ABCDEF -1
ABCDEF -1

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

Было бы намного проще сделать одну gsub() для объединенной записи, содержащей как 2-й, так и 3-й столбцы, как показано ниже.Поскольку первый аргумент gsub() принимает аргумент регулярного выражения, вы можете указать оба символа de-limit и требовать их замены одним пробелом (значение по умолчанию FS).

awk '{ var = ($2 FS $3); gsub(/[-:]/, FS, var); print $1, mktime(var) }' test.txt
1 голос
/ 20 сентября 2019

Не могли бы вы попробовать следующее.

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...