【问题标题】:Converting a file of dates into unix time with awk使用 awk 将日期文件转换为 unix 时间
【发布时间】:2014-08-28 02:55:04
【问题描述】:

我有一个包含日期和经纬度的文件,我想将 UTC 中的日期转换为 unix 时间。我决定在 awk 脚本中使用 unix date 函数来执行此操作。我试过了:

awk 'BEGIN {t=$3; c="date -j -f %Y%j%H%M%S "t" +%s"; c|getline; close( c ); print $1, $2, c; }' test.txt

t 是我文件中的第三行,格式为 2014182120311。我是 awk/脚本的新手,不确定是否可以将 awk 变量嵌入到 awk 行内的 unix 命令中。

当我运行脚本时出现错误:

usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... 
        [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]

所以我认为我没有正确定义“t”。非常感谢任何帮助!

附带说明-我已经尝试过 mktime 和其他 awk 时间功能,但我相信它们对我不起作用,因为我没有 gawk。

【问题讨论】:

    标签: unix awk


    【解决方案1】:

    您没有安装gawk 的选项吗?稍后你会感谢自己的(例如,请参阅 Converting list of dates from a file to timestamp with bash)。

    BEGIN 部分在打开任何文件之前执行,因此 $3(从当前文件读取的当前记录的第三个字段)在该部分中没有任何意义,因此 t=$3 只是设置变量 @ 987654327@ 为空字符串。

    你不想打印命令,c,你想打印getline读取的命令执行结果,但是当你使用无向getline时,它会覆盖$0、$1等,所以你应该将结果保存在 var 中(请参阅 http://awk.info/?tip/getline)。

    你可能想要这样的东西:

    awk '{
        cmd = "date -j -f %Y%j%H%M%S " $3 " +%s"
        if ( (cmd | getline time) > 0 ) {
            print $1, $2, time
        }
        close(cmd)
    }' test.txt
    

    如果没有,请发布一些示例输入和预期输出,以便我们为您提供帮助。

    【讨论】:

    • 你上面的例子给出了我正在寻找的结果——这样的逻辑更有意义。将研究安装 gawk。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 2016-04-24
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多