Замена даты на EPOCH в выходных данных столбца

Замена даты на EPOCH в выходных данных столбца

У меня есть такой набор данных:

user1 1234 01/01/2020
user2 2345 02/02/2020

Мне нужно преобразовать третий столбец (дату) в EPOCH, сохранив при этом имя пользователя и номер идентификатора.

user1 1234 1577862000
user2 2345 1580626800

Мне удалось выполнить преобразование и печать, но новая дата добавляется в новую строку.

$awk '{print($1,$2)}; system("date -d "$3" +%s")' data
user1 1234
1577862000
user2 2345
1580626800

Как сделать так, чтобы новая дата EPOCH находилась на одной строке со столбцами 1 и 2?

решение1

printдобавляет новую строку по умолчанию. Используйте printf:

awk '{printf "%s %s ",$1,$2; system("date -d "$3" +%s")}' data

OFSЕсли бы был определен специальный разделитель выходных полей , вы могли бы использовать

awk '{printf "%s%s%s%s",$1,OFS,$2,OFS; system("date -d "$3" +%s")}' data

Обратите внимание, что каждый из них %sполучает один из оставшихся аргументов printf.

Выход:

user1 1234 1577847600
user2 2345 1580612400

решение2

Если у вас есть GNU awk (он же awk gawk), вы можете использовать его встроенную mktimeфункцию времени (хотя для начала потребуется немного поработать с форматом входной даты):

$ gawk 'split($3,a,"/") {$3 = mktime(sprintf("%04d %02d %02d 00 00 00",a[3],a[2],a[1]))} 1' data
user1 1234 1577854800
user2 2345 1580619600

В качестве альтернативы Миллер предлагает C-стиль strptimeи strftime:

$ mlr --nidx put '$3 = strftime(strptime($3,"%d/%m/%Y"),"%s")' data
user1 1234 1577854800
user2 2345 1580619600

или аналогично в Perl, с модулем Time::Piece:

$ perl -MTime::Piece -alne '
    $t = pop @F; print join " ", @F, Time::Piece->strptime($t,"%d/%m/%Y")->strftime("%s")
  ' data
user1 1234 1577854800
user2 2345 1580619600

Связанный контент