在unix中更改逗号分隔文件.csv的列中日期的格式

时间:2015-02-04 13:35:11

标签: csv awk sed

我需要一个unix命令,可以使用(“,”而不是)来转换以下.csv表:

enter image description here .. 到

enter image description here

我认为awk或sed命令能够做到,但我无法理解。

对于那些想要查看原始csv的人:

"Area","Locale","Date","Prefix","INT","Cap","CF","loss","Fall","WR"
"base","NewYork","20150331","100","0","3.225","3.225","0","0","0"
"base","NewYork","20150930","100","0","3.225","3.225","0","0","0"
"base","NewYork","20160331","100","0","3.225","3.225","0","0","0"
"base","NewYork","20160930","100","0","3.225","3.225","0","0","0"
"base","NewYork","20170331","100","0","3.475","3.475","0","0","0"
"base","NewYork","20170929","100","0","3.475","3.475","0","0","0"
"base","NewYork","20180329","100","0","3.475","3.475","0","0","0"
"base","NewYork","20180928","100","0","3.475","3.475","0","0","0"
"base","NewYork","20190329","100","0","3.475","3.475","0","0","0"

"Area","Locale","Date","Prefix","INT","Cap","CF","loss","Fall","WR"
"base","NewYork","3/31/2015","100","0","3.225","3.225","0","0","0"
"base","NewYork","9/30/2015","100","0","3.225","3.225","0","0","0"
"base","NewYork","3/31/2016","100","0","3.225","3.225","0","0","0"
"base","NewYork","9/30/2016","100","0","3.225","3.225","0","0","0"
"base","NewYork","3/31/2017","100","0","3.475","3.475","0","0","0"
"base","NewYork","9/29/2017","100","0","3.475","3.475","0","0","0"
"base","NewYork","3/29/2018","100","0","3.475","3.475","0","0","0"
"base","NewYork","9/28/2018","100","0","3.475","3.475","0","0","0"
"base","NewYork","3/29/2019","100","0","3.475","3.475","0","0","0"

3 个答案:

答案 0 :(得分:2)

通过Perl。

$ perl -pe 's~^([^,]*,[^,]*,")(\d{4})(0([1-9])|(1[012]))(\d{2})"~\1\4\5/\6/\2"~' file
"Area","Locale","Date","Prefix","INT","Cap","CF","loss","Fall","WR"
"base","NewYork","3/31/2015","100","0","3.225","3.225","0","0","0"
"base","NewYork","9/30/2015","100","0","3.225","3.225","0","0","0"
"base","NewYork","3/31/2016","100","0","3.225","3.225","0","0","0"
"base","NewYork","9/30/2016","100","0","3.225","3.225","0","0","0"
"base","NewYork","3/31/2017","100","0","3.475","3.475","0","0","0"
"base","NewYork","9/29/2017","100","0","3.475","3.475","0","0","0"
"base","NewYork","3/29/2018","100","0","3.475","3.475","0","0","0"
"base","NewYork","9/28/2018","100","0","3.475","3.475","0","0","0"
"base","NewYork","3/29/2019","100","0","3.475","3.475","0","0","0"
"base","NewYork","12/29/2019","100","0","3.475","3.475","0","0","0"

通过sed,

我刚刚将上述Perl正则表达式中的\d替换为[0-9],因为sed不支持\d符号。

$ sed -r 's~^([^,]*,[^,]*,")([0-9]{4})(0([1-9])|(1[012]))([0-9]{2})"~\1\4\5/\6/\2"~' file
"Area","Locale","Date","Prefix","INT","Cap","CF","loss","Fall","WR"
"base","NewYork","3/31/2015","100","0","3.225","3.225","0","0","0"
"base","NewYork","9/30/2015","100","0","3.225","3.225","0","0","0"
"base","NewYork","3/31/2016","100","0","3.225","3.225","0","0","0"
"base","NewYork","9/30/2016","100","0","3.225","3.225","0","0","0"
"base","NewYork","3/31/2017","100","0","3.475","3.475","0","0","0"
"base","NewYork","9/29/2017","100","0","3.475","3.475","0","0","0"
"base","NewYork","3/29/2018","100","0","3.475","3.475","0","0","0"
"base","NewYork","9/28/2018","100","0","3.475","3.475","0","0","0"
"base","NewYork","3/29/2019","100","0","3.475","3.475","0","0","0"
"base","NewYork","12/29/2019","100","0","3.475","3.475","0","0","0"

答案 1 :(得分:2)

$ awk 'BEGIN{FS=OFS="\",\""}
       {$3 = substr($3,5,2)+0 "/" substr($3,7,2)+0 "/" substr($3,1,4)} 1' file
"Area","Locale","0/0/Date","Prefix","INT","Cap","CF","loss","Fall","WR"
"base","NewYork","3/31/2015","100","0","3.225","3.225","0","0","0"
"base","NewYork","9/30/2015","100","0","3.225","3.225","0","0","0"
"base","NewYork","3/31/2016","100","0","3.225","3.225","0","0","0"
"base","NewYork","9/30/2016","100","0","3.225","3.225","0","0","0"
"base","NewYork","3/31/2017","100","0","3.475","3.475","0","0","0"
"base","NewYork","9/29/2017","100","0","3.475","3.475","0","0","0"
"base","NewYork","3/29/2018","100","0","3.475","3.475","0","0","0"
"base","NewYork","9/28/2018","100","0","3.475","3.475","0","0","0"
"base","NewYork","3/29/2019","100","0","3.475","3.475","0","0","0"

根据您的预期输出,+0会将03转换为3等。

答案 2 :(得分:1)

假设您的文件名为raw

cat <(head -n 1 raw) <(while read Area Locale Date Prefix INT Cap CF loss Fall WR; do echo \"${Area}\",\"${Locale}\",\"${Date:4:2}/${Date:6:2}/${Date:0:4}\",\"${Prefix}\",\"${INT}\",\"${Cap}\",\"${CF}\",\"${loss}\",\"${Fall}\",\"${WR}\"; done < <(tail -n +2 raw | column -ts"," | tr -d \"))

演练:使用column拆分文件并删除&#39;&#34;&#39;&#39;使用tr。然后将所有列读取为仅格式化Date的参数。稍后它会在整个文件上激活while而不使用tail}并使用head将标头添加到使用<()cat打开的临时描述符。< / p>

输出:

"Area","Locale","Date","Prefix","INT","Cap","CF","loss","Fall","WR"
"base","NewYork","03/31/2015","100","0","3.225","3.225","0","0","0"
"base","NewYork","09/30/2015","100","0","3.225","3.225","0","0","0"
"base","NewYork","03/31/2016","100","0","3.225","3.225","0","0","0"
"base","NewYork","09/30/2016","100","0","3.225","3.225","0","0","0"
"base","NewYork","03/31/2017","100","0","3.475","3.475","0","0","0"
"base","NewYork","09/29/2017","100","0","3.475","3.475","0","0","0"
"base","NewYork","03/29/2018","100","0","3.475","3.475","0","0","0"
"base","NewYork","09/28/2018","100","0","3.475","3.475","0","0","0"
"base","NewYork","03/29/2019","100","0","3.475","3.475","0","0","0"

请注意,这可用于操纵其他数据,因为所有内容都已解析...但是,对于解析csv文件,您应该使用csv解析器:)