【问题标题】:Convert the date format MM/DD/YYYY to DD-Mmm-YYYY using bash script使用 bash 脚本将日期格式 MM/DD/YYYY 转换为 DD-Mmm-YYYY
【发布时间】:2017-06-29 21:22:38
【问题描述】:

4 列中有一个显示日期(MM/DD/YYYY) 的文本文件。我想将 column4 的日期格式更改为DD-Mmm-YYYY。 当我使用 date -d 08/31/2017 "+%d-%b-%Y" 命令时,它可以完美运行并将日期格式转换为 31-Aug-2017。但是当我在 bash 脚本中使用 awk 执行相同的命令时,它对我不起作用。

awk 'BEGIN { FS = ","; OFS = FS;} {if(NR>1){$4=date -d $4 "+%d-%b-%Y";print} else{print}}' file >> tmpfile

【问题讨论】:

    标签: bash shell unix awk


    【解决方案1】:

    您需要使用 |重定向日期命令并返回输出,因此如果第 4 列是您在文件“文件名”中关注的列:

    awk '{ print |"date -d "$4" \"+%d-%b-%Y\"" }' filename
    

    完整的解决方案是:

    awk -F, '{ for (i=1;i<=3;i++) { var=var$i"," } for (i=5;i<=NF-1;i++) { var1=var1$i"," } print |"echo "var"$(date -d "$4" \"+%d-%b-%Y\"),"var1$NF }' filename
    

    我们知道我们正在关注第 4 列,因此我们使用第 1 到 3 列构建一个变量 (var),然后构建一个日期命令,最后构建一个 var 1 变量。然后所有这些都用于构建一个定向回显命令。

    【讨论】:

    • 我相信,OP 希望打印整行,而不仅仅是第 4 列。
    • 我希望让用户了解如何解决问题。我已经添加了完整的解决方案。
    【解决方案2】:

    awk解决方案:

    测试输入文件:

    > cat input
    aa,ss,dd,08/31/2017,sdf
    

    awk 'BEGIN{ FS=OFS="," }NR>1{ split($4,a,"/"); 
         $4=strftime("%d-%b-%Y", mktime(sprintf("%d %d %d 0 0 0",a[3],a[1],a[2]))) }1' input
    

    输出:

    aa,ss,dd,31-Aug-2017,sdf
    

    关于 AWK 时间函数
    https://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-10
      • 2012-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多