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

Changing the format of a date in a column of a comma delimited file .csv in unix

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

.. 至

我认为 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"

通过 Perl。

$ perl -pe 's~^([^,]*,[^,]*,")(\d{4})(0([1-9])|(1[012]))(\d{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})"~//"~' 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"

假设您的文件名为 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 拆分文件并使用 tr 剥离“””。然后将所有列读入仅格式化 Date 的参数。稍后它会在整个过程中激活 while文件省略 headr(使用 tail)并使用 head 将 header 添加到使用 <()cat.

打开的临时描述符

输出:

"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 解析器 :)

$ awk 'BEGIN{FS=OFS="\",\""}
       { = substr(,5,2)+0 "/" substr(,7,2)+0 "/" substr(,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 等。