想要更改csv文件的日期列格式

时间:2013-06-13 12:19:40

标签: unix awk

我是批处理/ shell脚本的新手。我有一个像这样的CSV文件:

Id  depId   Name    city    Date                    prod
12345   52845   ken LA  08.08.2013 16:06:53 KLS22
25685   28725   Larry   MA  09.03.2013 16:06:58 KLt35
58345   28545   ken LA  06.08.2013 16:06:53 KLS22
75885   98725   Gow CA  05.04.2013 16:06:58 KLt35

约2000条记录。 col由制表符分隔。我想将日期列更改为以下格式:

DD_MM_YYY_hh_mm_ss

我用awk尝试了类似的东西:

awk -F '' '{ ("date -d \""$5"\" \"+%Y:%m/%d %T\"") | getline $5; print }' myfile.csv

但我得错了输出。

我希望输出如下:

Id  depId   Name    city    Date                    prod
58345   28545   ken LA  03_06_2013_23_00_00 KLS22
75885   98725   Gow CA  05_06_2013_23_00_00 KLt35

请帮忙!谢谢!

2 个答案:

答案 0 :(得分:1)

awk的一种方式:

$ awk 'NR>1{gsub(/\./,"_",$5);gsub(/:/,"_",$6);$5=$5"_"$6;$6=$NF;NF--}{$1=$1}1' OFS="\t" myfile.csv

测试:

$ cat temp
Id  depId   Name    city    Date                    prod
12345   52845   ken LA  8.8.2013 16:06:53   KLS22
25685   28725   Larry   MA  9.3.2013 16:06:58   KLt35
58345   28545   ken LA  6.8.2013 16:06:53   KLS22
75885   98725   Gow CA  5.4.2013 16:06:58   KLt35

$ awk 'NR>1{gsub(/\./,"_",$5);gsub(/:/,"_",$6);$5=$5"_"$6;$6=$NF;NF--}{$1=$1}1' OFS="\t" temp
Id      depId   Name    city    Date    prod
12345   52845   ken     LA      8_8_2013_16_06_53       KLS22
25685   28725   Larry   MA      9_3_2013_16_06_58       KLt35
58345   28545   ken     LA      6_8_2013_16_06_53       KLS22
75885   98725   Gow     CA      5_4_2013_16_06_58       KLt35

答案 1 :(得分:0)

一种更简单的方法,它不检查看起来像日期的字符串是否真的在正确的列中:

$ perl -pe 's/\t(\d)\.(\d)\.(\d\d\d\d) /sprintf("\t%04d-%02d-%02d ", $3, $2, $1) /e' t.csv
12345   52845   ken     LA      2013-08-08 16:06:53     KLS22
25685   28725   Larry   MA      2013-03-09 16:06:58     KLt35