繁体   English   中英

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

[英]Convert first column of file to unixtime using grep and awk

我有一个文件(名为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=,用于逗号分隔的输出。

这应该与您的示例:

 awk -F, -v q='"' '$0="echo "q"$(date -d"q$1q" +%s),"$2q' file|sh

测试一下:

kent$  cat f
2016-03-14 15:00:35,998191
2016-03-14 15:02:19,998181

kent$  awk -F, -v q='"' '$0="echo "q"$(date -d"q$1q" +%s),"$2q' f|sh
1457964035,998191
1457964139,998181

如果您已经使用了gnu sed ,那么此行也适用:

sed -r 's/([^,]*)(,.*)/echo $(date -d"\1" +%s\2)/ge' file

我会使用该语言的内置时间函数,而不是使用date

gawk -F, -v OFS=, '{gsub(/[:-]/, " ", $1); $1 = mktime($1); print}' file
perl -MTime::Piece -F, -lane '
    $F[0] = Time::Piece->strptime($F[0], "%Y-%m-%d %T")->epoch; 
    print join ",", @F
' file

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM