2016-08-01 113 views
1

我有以下形式的csv文件:劈裂CSV字符串列“日期时间”到“日期”,“时间”文件

$ head purchases.csv 
id,userID,itemID,price,platform,day 
1,9132,id_005,3600,2,2014-10-30 17:29:46 
2,67894,id_005,3000,1,2015-04-23 21:22:55 
3,272780,id_004,1000,1,2014-11-27 16:58:30 
4,302396,id_001,100,1,2014-12-11 08:35:07 

现在,我想改变CSV的最后一列。目前,它的格式为day2014-10-30 17:29:46即日期和时间之间有空格。但我想这列分成两列daytime使变更后的csv文件就变成了:

$ head purchases.csv 
id,userID,itemID,price,platform,day,time 
1,9132,id_005,3600,2,2014-10-30,17:29:46 
2,67894,id_005,3000,1,2015-04-23,21:22:55 
3,272780,id_004,1000,1,2014-11-27,16:58:30 

如何从终端做呢?

+0

考虑一下,如果你真的想这样做。大部分时间感知的工具(比如Excel)都能够很好地读取日期时间。 – chthonicdaemon

回答

2

在$ 6使用split

$ awk -v OFS=\, -F\, 'NR==1{print $0,"time";next} {split($6,a," "); print $1,$2,$3,$4,$5,a[1],a[2]}' test.in 
id,userID,itemID,price,platform,day,time 
1,9132,id_005,3600,2,2014-10-30,17:29:46 
2,67894,id_005,3000,1,2015-04-23,21:22:55 
3,272780,id_004,1000,1,2014-11-27,16:58:30 
4,302396,id_001,100,1,2014-12-11,08:35:07 

或者你可以使用gsub,只是用逗号代替空间:

$ awk -v OFS=\, -F\, 'NR==1{print $0,"time";next} {gsub(/ /,",",$6); print $0}' test.in 
+0

做得很好;我建议更突出地介绍第二种解决方案,因为它更容易推广。还要注意''sub()'(而不是'gsub()')就足够了,因为你只替换了_single_空间。 – mklement0

1

James Brown's answer是有帮助的,但是硬编码来修改,而列还假设它是最后

一些简单的调整概括解决方案:

awk -v ndx=6 -F, 'NR==1 {sub(/$/, ",time", $ndx); print; next} sub(" ", ",", $ndx)' \ 
    purchases.csv