在列输出中用 EPOCH 替换日期

在列输出中用 EPOCH 替换日期

我有一组这样的数据:

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

我需要将第三列(日期)转换为 EPOCH,同时保留用户名和 ID 号。

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 (又名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

或者,Miller 提供 C 型strptimestrftime

$ 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

相关内容