【问题标题】:Reformatting date times with awk使用 awk 重新格式化日期时间
【发布时间】:2016-02-21 03:12:09
【问题描述】:

我有一个包含如下行的文件:

2012/04/08 15:00,207
2012/04/08 16:00,180

我想格式化日期,使文件看起来像:

08/04/2012 15:00,207

Awk 似乎是正确的工具,但我无法让它正确捕获组。我尝试过类似以下的方法 (Use sed or awk to fix date format):

awk ' BEGIN { FS = OFS = "," } { split($1, date, /\// ) $1 = date[3] "-" date[2] "-" date[1] " " date[4] print $0 } ' $FILE

但它给我留下了这样的数据:

08 15:00-04-2012,207

Awk 的拆分显然是将时间解释为日期字符串的年份字段的一部分,而我似乎无法找到将其单独拆分的方法。我在拆分分隔符字段中尝试了许多不同的东西,比如冒号或转义空格,但都给出了语法错误。看过 awk split 的文档,并没有受到启发。

【问题讨论】:

    标签: linux unix awk sed delimiter


    【解决方案1】:
    $ awk '{split($1,date,"/"); print date[3] "/" date[2] "/" date[1], $2}' file
    08/04/2012 15:00,207
    08/04/2012 16:00,180
    

    仅供参考,有 GNU awk 或 sed 用于捕获组的替代方案:

    $ awk '{print gensub(/(....)\/(..)\/(..)/,"\\3/\\2/\\1",1)}' file
    08/04/2012 15:00,207
    08/04/2012 16:00,180
    
    $ awk 'match($0,/(....)\/(..)\/(..)(.*)/,a){ print a[3]"/"a[2]"/"a[1] a[4] }' file
    08/04/2012 15:00,207
    08/04/2012 16:00,180
    
    $ sed -r 's#(....)/(..)/(..)#\3/\2/\1#' file
    08/04/2012 15:00,207
    08/04/2012 16:00,180
    

    【讨论】:

      【解决方案2】:

      这是一个使用正则表达式字段拆分的解决方案,方法是将 FS 设置为拆分时间戳然后重新组合的正则表达式:

      awk '
        BEGIN { FS= "[/ ]"; }
        {print $3 "/" $2 "/" $1 " "  $4 ;}
      ' file
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-13
        • 2020-01-31
        • 2014-05-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多