编辑日期为.csv的字段

时间:2015-09-30 14:23:14

标签: linux bash awk

我的.csv文件包含这样的行:

xxxx,xxxxxx,Sep  1, 2015 21:32:15.xxxxxxxxx WEST
xxxx,xxxxxx,Sep 28, 2015 23:46:16.xxxxxxxxx WEST
xxxx,xxxxxx,Sep 30, 2015 21:23:17.xxxxxxxxx WEST

我需要更改所有日期和时间:

xxxx,xxxxxx,2015-09-01,21:32:15
xxxx,xxxxxx,2015-09-28,23:46:16
xxxx,xxxxxx,2015-09-30,21:23:17

我认为使用awk和date是可能的,但直到现在还没有用。

2 个答案:

答案 0 :(得分:1)

$ cat tst.awk
BEGIN{ FS=OFS=","; mths="JanFebMarAprMayJunJulAugSepOctNovDec" }
{
    split($3,mthDay,/ +/)
    split($4,yrTime,/[ .]/)
    $3 = sprintf("%04d-%02d-%02d", yrTime[2], (match(mths,mthDay[1])+2)/3, mthDay[2])
    $4 = yrTime[3]
    print
}

$ awk -f tst.awk file
xxxx,xxxxxx,2015-09-01,21:32:15
xxxx,xxxxxx,2015-09-28,23:46:16
xxxx,xxxxxx,2015-09-30,21:23:17

答案 1 :(得分:0)

一些perl:

perl -MTime::Piece -F, -lape '
  ($d2, $d1) = (pop(@F), pop(@F));
  $d2 =~ s/\..*//;
  push @F, Time::Piece->strptime($d1.$d2, "%b %e %Y %T")->strftime("%Y-%m-%d,%T");
  $_ = join ",", @F;
' file

从每行删除最后2个以逗号分隔的字段,删除小数时间和时区,重新格式化时间并打印。