我有以下制表符分隔的输入文件,时间戳为 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
使用 GNUawk
和MK时间:
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
。-u
GNU 的选项使其date
打印 UTC 时间而不是本地时间。
外部进程替换<( echo c; date ... )
输出新列的标题,然后生成该列的数据。
然后使用将其粘贴为现有数据的新列paste
。