【问题标题】:using system date command for data conversion using awk variables使用系统日期命令使用 awk 变量进行数据转换
【发布时间】:2014-04-16 04:19:50
【问题描述】:

日志文件看起来像:

28 Feb 2014,12:43:10,SAST,1821996800,10.144.22.91,494225040,"CONNECT",STARTED,0,0,0,10.144.22.91:59172,->,1.1.1.6:80
28 Feb 2014,12:43:10,SAST,1821996800,10.144.22.91,494225040,"CONNECT",TERMINATED,0,0,0,10.144.22.91:59172,->,1.1.1.6:80

期望的输出:

2014/02/28,12:43:10,SAST,1821996800,10.144.22.91,494225040,"CONNECT",STARTED,0,0,0,10.144.22.91:59172,->,1.1.1.6:80
2014/02/28,12:43:10,SAST,1821996800,10.144.22.91,494225040,"CONNECT",TERMINATED,0,0,0,10.144.22.91:59172,->,1.1.1.6:80

正在执行转换的 Shell 命令:

date -d "28 Feb 2014" +%Y/%m/%d

问题: 我如何使用 awk 进行这种转换(稍后我需要在不同时区之间进行转换,这就是为什么要使用 date 命令并且没有 sed 或其他方法来操作字符的原因) 目前尝试了几个选项,但都没有正常工作:

版本 1(由于某种原因,date 命令没有使用完整的 awk 变量运行,并给我错误,所以没有结果):

 awk '
    BEGIN { FS = "," }
    {   
    while ("date -d $1 +%Y/%m/%d" | getline ddd) print ddd;
    }
  ' _SOURCE_FILE

第 2 版(这不能按预期工作,但给我一个额外的行并在其中添加一个“0”,即系统执行代码):

awk '
    BEGIN { FS = "," }
    {   
    $1 = system("date -d \"$1\" +%Y/%m/%d")
    print $0
    }
  ' _SOURCE_FILE

帮助不胜感激。

【问题讨论】:

    标签: shell awk


    【解决方案1】:

    awk 不扩展字符串内的变量,使用连接。当命令只产生一行输出时,也不需要使用while

    "date -d " $1 "+%Y/%m/%d" | getline ddd;
    $1 = ddd;
    print $0;
    

    【讨论】:

    • 感谢 Barmar 的快速回复。当我遇到错误时,我在理解如何使用您的示例时遇到了一些麻烦。日期:额外操作数2014+%Y/%m/%d' Try date --help' 了解更多信息。
    猜你喜欢
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    • 2019-02-20
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    • 2013-04-01
    相关资源
    最近更新 更多