使用awk格式化列中的日期

时间:2014-12-05 02:28:49

标签: bash awk gsub

我只是想解决这个问题。我正在运行下面的代码

 awk -F, 'NR>1{gsub(/\:/,"",$4);gsub(/\-/,"",$4);gsub(/\.0/,"",$4);gsub(/\ /,",",$4);NF--}{$1=$1}1' OFS=, sample

$ cat示例

 1,0,null,2014-11-24 08:15:18.0,1
 1,0,null,2014-11-24 08:15:16.0,1

输出

1,0,null,2014-11-24 08:15:18.0,1
1,0,null,20141124,081516

我的预期输出:

1,0,null,20141124,081518,1
1,0,null,20141124,081516,1

任何可以帮我处理上述代码的人?

4 个答案:

答案 0 :(得分:1)

你可能只需要

awk -F, '{gsub(/[-:]/,"",$4);sub(/ /,OFS,$4);sub(/\.0$/,"",$4)}1' OFS=, sample

答案 1 :(得分:0)

#!/usr/bin/awk -f
$1 {
  gsub(/(\.0|[-:])/, "")
  gsub(/ /, ",")
  print
}

答案 2 :(得分:0)

您最好不要使用gsub,而是最好使用split

awk '
BEGIN { FS = OFS = "," }
{
    split ($4, flds, /[- :.]/);
    $4 = flds[1] flds[2] flds[3] FS flds[4] flds[5] flds[6]
 }1' sample
1,0,null,20141124,081518,1
1,0,null,20141124,081516,1
  • 我们将BEGIN块中的输入和输出字段分隔符设置为,
  • 使用split,我们会在-:.上打破第四个字段,并将其放入数组中。
  • 然后,我们通过连接数组元素重新构造第四个字段。
  • 1最后会执行默认awk操作,即print

答案 3 :(得分:0)

$ awk 'BEGIN{FS=OFS=","} {gsub(/[-:]|\.0/,"",$4); sub(/ /,OFS,$4)} 1' file
1,0,null,20141124,081518,1
1,0,null,20141124,081516,1

或:

$ awk 'BEGIN{FS="[ ,]";OFS=","} {gsub(/-/,"",$4); gsub(/:|\.0/,"",$5)} 1' file
1,0,null,20141124,081518,1
1,0,null,20141124,081516,1