Bash 将文件中的时间戳转换为纪元

Bash 将文件中的时间戳转换为纪元,bash,vim,awk,sed,gawk,Bash,Vim,Awk,Sed,Gawk,我有一个选项卡分隔的文件,在第三个字段中有时间戳,我需要在bash中将其更改为历元 样本输入: xyz@gmail.com SALE 2017-04-26 12:47:27 30.0 1 201704 xyz@gmail.com SALE 2017-04-26 12:46:15 20.0 2 201704 xyz@gmail.com PAYBACK 2017-04-18 08:02:31 95.0 3

我有一个选项卡分隔的文件,在第三个字段中有时间戳,我需要在bash中将其更改为历元

样本输入:

xyz@gmail.com   SALE    2017-04-26 12:47:27     30.0    1       201704
xyz@gmail.com   SALE    2017-04-26 12:46:15     20.0    2       201704
xyz@gmail.com   PAYBACK 2017-04-18 08:02:31     95.0    3       201704
xyz@gmail.com   SEND    2017-04-18 08:00:37     4800.0  4       201704
xyz@gmail.com   SEND    2017-04-17 14:59:34     4900.0  5       201704
我尝试了
awk'BEGIN{IFS=“\t”}{$3=system(“date-d\”“$3”\'+%s”);print}文件
,该文件给出了最接近的结果,但它在一行中显示历元,然后在时间戳值为零的换行中再次显示记录。我需要一条记录中的所有内容,并替换第三个字段。

使用GNU awk:

$ cat tst.awk
BEGIN { FS=OFS="\t" }
{
    $3 = mktime(gensub(/[-:]/," ","g",$3))
    print
}

$ awk -f tst.awk file
xyz@gmail.com   SALE    1493228847      30.0    1       201704
xyz@gmail.com   SALE    1493228775      20.0    2       201704
xyz@gmail.com   PAYBACK 1492520551      95.0    3       201704
xyz@gmail.com   SEND    1492520437      4800.0  4       201704
xyz@gmail.com   SEND    1492459174      4900.0  5       201704
对于其他AWK:

$ cat tst.awk
BEGIN { FS=OFS="\t" }
{
    cmd = "date -d \"" $3 "\" \047+%s\047"
    if ( (cmd | getline line) > 0 ) {
        $3 = line
    }
    close(cmd)
    print
}

$ awk -f tst.awk file
xyz@gmail.com   SALE    1493228847      30.0    1       201704
xyz@gmail.com   SALE    1493228775      20.0    2       201704
xyz@gmail.com   PAYBACK 1492520551      95.0    3       201704
xyz@gmail.com   SEND    1492520437      4800.0  4       201704
xyz@gmail.com   SEND    1492459174      4900.0  5       201704
编写脚本-没有名为
IFS
的内置awk变量,
系统
返回上一次命令运行的退出状态,而不是stdout,并且不能在从shell调用的任何
分隔脚本中包含
'
s

要想“就地”进行编辑,没有UNIX编辑器真正就地进行编辑,但在GNU awk中,您可以使用
-i inplace
来避免自己指定tmp文件名。但是,使用任何UNIX命令,您都可以执行
cmd file>tmp&&mv tmp file


请注意,这是
getline
为数不多的适当用途之一-有关其他有效用途,请参阅,最重要的是,除非绝对必要,否则不要使用它的注意事项和理由。

感谢您的帮助。。。这个解决方案有效。我理解就地部分以及为什么不能在这里完成,但是你能解释一下或者给我一些链接我的脚本出了什么问题吗?我不知何故无法编辑m评论来删除“此处”,但我的意思是我理解为什么不能完成。只是希望通过一些链接来理解我的脚本中的问题,以及更详细的解决方法。尽管如此,谢谢你的帮助,我很乐意去。:-)不客气,我建议您购买Arnold Robbins的《有效的Awk编程》第四版。它将解释您开始使用awk和更多所需了解的一切。