获取纪元时间并将其添加为新列

获取纪元时间并将其添加为新列

我有以下制表符分隔的输入文件,时间戳为 UTC。如何计算纪元时间并将其添加为新列?这是一个大文件,行数超过 60MM。

a   b
0   2020-03-03 15:46:52
1   2020-03-02 11:05:17

输出:

a   b                   c  
0   2020-03-03 15:46:52 1583279212
1   2020-03-02 11:05:17 1583175917

答案1

使用 GNUawkMK时间

awk '
  BEGIN{ FS=OFS="\t" }
  FNR==1{ print $0, "c"; next }
  {
    split($2, a, /[ :-]/)
    print $0, mktime(a[1]" "a[2]" "a[3]" "a[4]" "a[5]" "a[6], 1)
  }
' file
  • 使用制表符作为输入和输出字段分隔符
  • 附加c到标题行
  • a使用空格字符将第二个字段拆分为数组,:-作为分隔符并使用 UTC 标志打印时间戳

输出:

a       b       c
0       2020-03-03 15:46:52     1583250412
1       2020-03-02 11:05:17     1583147117

答案2

我不确定它对于大文件有多合适,但你尝试这样做磨坊主

$ TZ=UTC mlr --pprint --fs tab put -S '$c = strftime(strptime($b,"%Y-%m-%d %H:%M:%S"),"%s")' file
a   b                                   c
0   2020-03-03 15:46:52 1583250412
1   2020-03-02 11:05:17 1583147117

(尽管我刚刚注意到,当 OFS 为制表符时,它似乎会搞乱标题对齐...)。

答案3

在支持进程替换的任何其他 shelldate中使用 GNU :bash

$ paste file <( echo c; date -u -f <( cut -f 2 file | sed 1d ) +%s )
a       b       c
0       2020-03-03 15:46:52     1583250412
1       2020-03-02 11:05:17     1583147117

最里面的进程替换<( cut -f 2 file | sed 1d )产生原始数据的第二列(时间戳),并删除了标头。这些时间戳date通过进程替换的选项输入 GNU -f,并使用输出格式 string 转换为 Unix 秒%s-uGNU 的选项使其date打印 UTC 时间而不是本地时间。

外部进程替换<( echo c; date ... )输出新列的标题,然后生成该列的数据。

然后使用将其粘贴为现有数据的新列paste

相关内容