CSV:awk更改列值

时间:2017-06-12 19:53:54

标签: shell csv awk

我尝试解析csv文件,需要更改一些值以便进一步处理。

csv文件包含日期col(列号4),其中包含如下值: 2016032100 2016032318 等

我想更改csv文件中的所有日期值 2016032102来自: 2016-03-21 02:00:00

我尝试了以下内容:

echo "$(awk -F';' -v OFS=';' '$4=${4:0:4}-${4:4:2}-${4:6:2} ${4:8:2}:00:00"' $FILE)" > $FILE

但这当然行不通。

我也尝试将转换转换为函数,但这也不起作用。

你有什么想法吗?

2 个答案:

答案 0 :(得分:1)

永远不要:

echo "$(command $FILE)" > $FILE

对于“command”的任何值,因为shell在调用“command”来读取它之前可以高兴地清空$ FILE。这样做:

command "$file" > tmp && mv tmp "$file"

我还引用了变量,并将其从大写更改为小写,因为这两件事情也很重要(谷歌或阅读任何shell书)。

现在回到您的具体问题,这是您的代码似乎正在尝试做的事情:

awk 'BEGIN{FS=OFS=";"} {$4=substr($4,1,4)"-"substr($4,5,2)"-"substr($4,7,2)" "substr($4,9,2)":00:00"} 1' "$file"

这是否符合您的要求将取决于我们尚未看到的CSV的其他内容,但实际上并不是逗号分隔值(CSV)文件。

答案 1 :(得分:0)

你可以使用python csv模块读取文件,datatime模块进行转换

import datetime
pythonTime = datetime.datetime.strptime("2016032100", "%Y%m%d%H")
print pythonTime.strftime("%Y-%m-%d %H:%M:%S")