linux - 使用 grep 和 awk 将文件的第一列转换为 unixtime

标签 linux bash awk grep

我有一个文件(名为 2n.log),我希望将第一列中的人类可读日期和时间转换为 unix 时间:

 2016-03-14 15:00:35,998191
 2016-03-14 15:02:19,998181

在命令行上,如果我使用 date 命令,我会得到正确的 unix 时间戳,例如

 user@server1:~# date -d "2016-03-14 15:02:19" "+%s"
 1457967739

但是,如果我在 awk 中输入相同的命令,我会得到错误的 unix 时间戳值,这是我使用的 bash 脚本(名为 2n.sh:

#!/bin/env bash
grep ".*2016" 2n.log | awk -F ',' -v dt="$(date -d "$1" "+%s")" '{print dt","$2}'

这是输出:

user@server1:~# sh 2n.sh
1457913600,998191
1457913600,998181`

是 grep 通配符的问题还是 awk 声明的问题?我尝试用 grep 通配符替换“2016.*”,但根本没有得到任何输出。

谢谢

最佳答案

您不是从第一个字段计算日期,此时 shell 仍然负责。你可以这样做

$ awk -F, '{cmd="date -d \""$1"\" +%s"; cmd | getline date; print date, $2}' logfile
1457982035 998191
1457982139 998181

为逗号分隔输出添加 -v OFS=,

关于linux - 使用 grep 和 awk 将文件的第一列转换为 unixtime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35991602/

相关文章:

使用 R 中另一个数据帧的其他匹配 ID 替换数据帧中的值

bash - "set - $VARIABLE"在 bash 中是什么意思?

bash - sudo : ./untitled.sh: 找不到命令

bash - 将所有数字缩写转换为文本文件中的数值

linux - awk 和特殊括号定界符

bash - 在变量中搜索实例 ID 的所有出现

linux - iptables 转发端口到两个 eth 卡

linux - 使用awk时如何将数字和单位与变量分开

linux - 在一定条件下合并两个文件

linux - 如何将带有多个引号/特殊字符的行回显到文件中?