【问题标题】:awk convert quoted timestamp to specific date time formatawk 将引用的时间戳转换为特定的日期时间格式
【发布时间】:2016-02-26 12:44:12
【问题描述】:

我需要将 unix 时间戳值(在 lof 文件的第一个字段中)转换为特定的日期时间格式(%m/%d/%Y %H:%M:%S.%3N)

给你一个例子。我有一个看起来像这样的日志文件

"1456316486","1000","11678","0.00","0.00","0.00","0.00","1","0.00","0.00","1792364","652108","8.02","0.00","0.00","0.00","0","remmina"

我需要它看起来像这样

"02/24/2016 13:21:26.000","1000","11678","0.00","0.00","0.00","0.00","1","0.00","0.00","1792364","652108","8.02","0.00","0.00","0.00","0","remmina"

能够将其导入另一个工具。

附:我知道有很多例子可以做到这一点,但作为一个 awk n00b,我无法让它完全按照我的意愿去做。

感谢您的帮助

【问题讨论】:

标签: bash awk


【解决方案1】:

我用$1+0 尝试了 mpez0 优雅的解决方案,但对我来说它不起作用。我必须在 strftime 之前从$1 中明确删除",因此我为 GNU-Awk 4.0.1 提出了这个解决方案:

awk -v FS=, -v OFS=, '{gsub(/"/,"",$1 ); $1 = strftime("\"%D %T.000\"",$1); print; }' file
  • %D 表示 %m/%d/%y%T 表示 %H:%M:%S
  • 我找不到毫秒的格式,所以我在里面放了一个固定的.000
  • -v设置输入字段分隔符和输出字段分隔符,以使输入和输出用,分隔

【讨论】:

  • 只是一个小的调整,所以它输出引用awk -F, '{gsub(/"/,"",$1 ); $1 = "\""strftime("%D %T.000",$1)"\""; print; }' file的第一个字段
  • @MartinPavlik 我在 strfttime 字符串中添加了\"
【解决方案2】:

使用 GNU awk 进行 strftime:

$ awk 'BEGIN{FS=OFS="\""} {$2=strftime("%D %T.000")} 1' file
"02/26/16 07:53:29.000","1000","11678","0.00","0.00","0.00","0.00","1","0.00","0.00","1792364","652108","8.02","0.00","0.00","0.00","0","remmina"

【讨论】:

    【解决方案3】:

    如果您使用的是最新版本的 awk,其时间戳扩展超过了原始版本(您可能是这样),那么

    timestr = strftime("%m/%d/%Y %T.000", $1+0)

    应该给出你想要的字符串。您需要 +0 才能将数字字符串转换为数字。

    【讨论】:

    • 将 0 添加到不以数字开头的输入字符串(例如,在这种情况下为 ")只会使结果数字为 0。数字转换会去除尾随的非数字,但不会领先的。
    猜你喜欢
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多