【问题标题】:Convert timestamp to epoch in a file in-place在文件中将时间戳转换为纪元
【发布时间】:2017-10-06 00:55:40
【问题描述】:

我有一个 制表符 分隔文件,第三个字段中有时间戳,我需要在 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}' file,它给出了最接近的结果,但它在一行中显示纪元,然后在新行中再次显示记录,时间戳值为零。我需要在一条记录中全部替换第三个字段。

【问题讨论】:

    标签: bash vim awk sed gawk


    【解决方案1】:

    使用 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
    

    与其他 awks:

    $ 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 变量,system 返回最后一个命令运行的退出状态,而不是标准输出,并且你不能在任何 '-delimited 中包含 's从 shell 调用的脚本。

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

    请注意,这是 getline 的极少数适当用途之一 - 请参阅 http://awk.freeshell.org/AllAboutGetline 了解其他有效用途,最重要的是,除非绝对必要,否则不要使用它的注意事项和理由。

    【讨论】:

    • 感谢您的帮助 Ed... 此解决方案有效。我理解就地部分以及为什么不能在这里完成,但你能解释一下或给我一些链接我的脚本有什么问题吗?
    • 我不知何故无法编辑 m 评论以删除“这里”,但我的意思是我明白为什么不能这样做。只是希望有一些链接可以更详细地了解我的脚本和解决方法的问题。尽管如此,感谢您的帮助,我很高兴。 :-)
    • 不客气,我建议您阅读 Arnold Robbins 的《Effective Awk Programming, 4th Edition》一书。它将解释开始使用 awk 所需了解的所有内容等等。
    猜你喜欢
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 2021-01-18
    • 2022-01-13
    相关资源
    最近更新 更多