【发布时间】:2015-04-30 16:40:02
【问题描述】:
我在一个大约 1M 行的 csv 文件中有以下示例数据集。
20090531 235850000,605.530000,606.230000,0
20090531 235922000,605.500000,606.200000,0
20090531 235930000,605.530000,606.230000,0
20090531 235939000,605.550000,606.250000,0
20090531 235945000,605.500000,606.200000,0
20090531 235946000,605.530000,606.230000,0
我想“清理”数据。我希望它采用以下格式,其中^ 是要插入的字符,. 是要删除的字符:
2009-05-31 23:59:46 ,605.530000,606.230000
^ ^ ^ ^ ... ..
我认为sed 可能是最好的方法,但我对 sed 和正则表达式不太熟悉,无法高效地做,但到目前为止已经想出了以下内容。我已将每个正则表达式规则放在一个新行上以便于阅读。
sed '
s/.\{4\}/&-/;
s/.\{7\}/&-/;
s/.\{13\}/&:/;
s/.\{16\}/&:/' input.csv > output.csv
output.csv - 上述命令输出的内容:
2009-05-31 23:59:06000,605.530000,606.230000,0
2009-05-31 23:59:22000,605.500000,606.200000,0
2009-05-31 23:59:30000,605.530000,606.230000,0
2009-05-31 23:59:39000,605.550000,606.250000,0
所以剩下要做的就是在几秒钟后删除000并删除最后的,0
问题1:有没有比我的方法更好的方法来做上述操作? 问题2:如何去掉不想要的字符?
更新,我还删除了每行的最后 2 个字符。现在我只需要从时间中删除这 3 个零。
sed '
s/.\{4\}/&-/;
s/.\{7\}/&-/;
s/.\{13\}/&:/;
s/.\{16\}/&:/;
s/.\{2\}$//' input.csv > output.csv
解决方案:
sed -r '
s/^(.{4})(.{2})(.{2}) (.{2})(.{2})(.{2})000/\1-\2-\3 \4:\5:\6/;
s/.\{2\}$//' input.csv > output.csv
【问题讨论】: