【问题标题】:format date in file using awk使用 awk 格式化文件中的日期
【发布时间】:2014-11-14 09:55:34
【问题描述】:

文件内容是

Feb-01-2014     one     two
Mar-02-2001     three   four

我想将第一个字段(日期)格式化为 %Y%m%d 格式
我正在尝试使用 awk 和 date 命令的组合,但不知何故,即使我感觉我快到了,这还是失败了:

cat infile | awk -F"\t" '{$1=system("date -d " $1 " +%Y%m%d");print $1"\t"$2"\t"$3}' > test

这会打印出日期的使用页面,这让我认为日期命令已正确触发,但参数有问题,您是否在某处看到问题? 我对 awk 不是很熟悉,

【问题讨论】:

  • 为每一行调用system("date …") 效率非常低。

标签: bash date awk


【解决方案1】:

你不需要date,它只是重新排列日期字符串:

$ awk 'BEGIN{FS=OFS="\t"} {
    split($1,t,/-/)
    $1 = sprintf("%s%02d%s", t[3], (match("JanFebMarAprMayJunJulAugSepOctNovDec",t[1])+2)/3, t[2])
}1' file
20140201        one     two
20010302        three   four

【讨论】:

    【解决方案2】:

    你可以使用:

    while read -r a _; do
       date -d "$a" '+%Y%m%d'
    done < file
    20140201
    20010302
    

    【讨论】:

      【解决方案3】:

      system() 返回命令的退出代码。

      改为:

      cat infile | awk -F"\t" '{"date -d " $1 " +%Y%m%d" | getline d;print d"\t"$2"\t"$3}'
      

      【讨论】:

        【解决方案4】:
        $ awk '{var=system("date -d "$1" +%Y%m%d | tr -d \"\\n\"");printf "%s\t%s\t%s\n", var, $2, $3}' file
        201402010       one     two
        200103020       three   four
        

        【讨论】:

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