【问题标题】:Comparing and transforming a date that is piped to (probably) awk?比较和转换通过管道传输到(可能)awk 的日期?
【发布时间】:2015-09-03 11:18:14
【问题描述】:

我有一个相当复杂的管道 shell 命令字符串(假设它是 bunch | of | commands),它们一起产生多行输出,格式如下:

some_path/some_file.csv 1439934121

...其中1439934121 是文件的最后修改时间戳。

我需要做的是查看它是否是当天的时间戳,即在最后一个午夜或之后,然后只包含正确的行。

我认为这意味着某些字符串(例如单词true)应该替换或附加到grep 的那些行的时间戳,以将它们与时间戳是较早日期的行区分开来。

用shell命令的话来说:

bunch | of | commands | ????

...应该产生:

some_path/some_file.csv truesome_path/some_file.csv 1439934121 true

...我可以很容易地grep(显然假设last midnight <= 1439934121 <= current time)。

什么样的???? 会这样做?我几乎可以肯定awk 可以做我需要它做的事情,所以我查看了它和date,但我基本上是在做 awk-by-google,没有任何技能,一无所获。

不要被我的工具假设所束缚;如果你可以通过其他方式实现这一点,考虑到bunch | of | commands 的输出,但仍然使用 shell 工具和管道,我全都听好了。如果可能的话,我想避免使用临时文件或 Perl :-)

我在 Ubuntu Linux 上使用 gawk + ​​bash 4.3,具体来说,没有可移植性问题。

【问题讨论】:

    标签: shell date awk pipe


    【解决方案1】:

    由于today 00:00:00 格式为%s 返回该时刻的unix 时间戳:

    $ date -d'today 00:00:00'
    Thu Sep  3 00:00:00 CEST 2015
    $ date -d 'today 00:00:00' "+%s"
    1441231200
    

    您可能可以通过管道连接到 awk,执行以下操作:

    ... | awk -v midnight="$(date -d 'today 00:00:00' '+%s')" '{$2= ($2>midnight) ? "true" : "false"}1'
    

    也就是说,使用三元运算符检查$2 的值,并根据结果替换为值真/假:

    awk -v midnight="$(date ...)" '{$2= ($2>midnight) ? "true" : "false"}1'
    

    测试

    $ cat a
    hello 1441231201
    bye 23
    $ awk -v midnight="$(date -d 'today 00:00:00' '+%s')" '{$2= ($2>midnight) ? "true" : "false"}1' a
    hello true
    bye false
    

    【讨论】:

    • 哇,这速度很快,而且似乎效果很好。谢谢!只要允许我就接受:-)
    猜你喜欢
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    相关资源
    最近更新 更多