2

我是批处理/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

请帮忙!谢谢!!

4

2 回答 2

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
于 2013-06-13T12:43:28.637 回答
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
于 2013-06-13T12:54:04.313 回答