我正在尝试使用bash
脚本将包含表格的HTML转换为.csv文件。
到目前为止,我已完成以下步骤:
dos2unix
)sed 's/[ \t]//g'
)sed ':a;N;$!ba;s/\n//g'
)(这是必要的,因为HTML文件的每个单元格都有一个空行......这不是我的错)<td>
和<tr>
代码(使用sed 's/<t.>//g'
)</td>
替换为','(使用sed 's/<\/td/,/g'
)</tr>
替换为行尾(\n
)字符(sed 's/<\/tr/\n/g'
)当然,我把所有这些都放在了管道中。到目前为止,它运作良好。最后一步我坚持:表格中有一个日期列,其格式为dd/mm/yyyy
,我想将它们转换为yyyy-mm-dd
。
是否有(简单)方法(使用sed
或awk
)?
数据样本(在整个sed
管道之后):
500,2,13/09/2007,30000.00,12,B-1
501,2,15/09/2007,14000.00,8,B-2
预期结果:
500,2,2007-09-13,30000.00,12,B-1
501,2,2007-09-15,14000.00,8,B-2
我需要这样做的原因是因为我需要将这些数据导入MySQL。我可以在Excel中打开文件并手动更改格式,但我想跳过它。
答案 0 :(得分:10)
Awk
可以非常轻松地完成此任务:
awk '
BEGIN { FS = OFS = "," }
{ split($3, date, /\//)
$3 = date[3] "-" date[2] "-" date[1]
print $0
}
' infile
它产生:
500,2,2007-09-13,30000.00,12,B-1
501,2,2007-09-15,14000.00,8,B-2
答案 1 :(得分:9)
sed -E 's,([0-9]{2})/([0-9]{2})/([0-9]{4}),\3-\2-\1,g'
答案 2 :(得分:4)
sed "s:,\([0-9]\+\)/\([0-9]\+\)/\([0-9]\+\),:,\3-\2-\1,:"
答案 3 :(得分:4)
awk
适用于此:
echo 08/26/2013 | awk -F/ '{printf "%s-%s-%s\n",$3,$2,$1}'
以及其中一个bash
- 只有选项:
IFS=/ read m d y < <(echo 08/26/2013); echo "${y}-${m}-${d}"
IFS=/ read m d y <<< "08/26/2013"; echo "${y}-${m}-${d}"
如果您碰巧使用ksh
,其中子shell未用于管道的最后一个组件,那么这也应该有效:
echo 08/26/2013 | IFS=/ read m d y; echo "${y}-${m}-${d}"
在最近的bash
中,您还可以在脚本中使用shopt -s lastpipe
以允许上述调用也能正常工作,但它不能在命令行上运行(感谢@ mklement0评论如下)。
我会告诉你如何将其与其他人整合......
答案 4 :(得分:2)
到目前为止,所有答案都非常具体针对OP的问题。这是一种更通用的方法,运行(GNU,用于-d
选项)date
到awk
:
awk 'BEGIN{FS=","}
{
"date -d\"" $3 "\" +%Y-%m-%d" | getline mydate;
print $1 "," $2 "," mydate "," $4 "," $5 "," $6
}'
当然,只有输入日期格式由date
处理时,此方法才能正常工作。不幸的是,AFAICS不是dd/mm/yyyy
的情况。可以尝试other commands而不是date
(未经测试)。
编辑:实施了mklement0的评论。
Edit2:实际上这不适用于mawk
,这是Debian的默认awk
实现。显而易见的解决方案是尽可能安装gawk
。
答案 5 :(得分:1)
对awk的修正假设你寻求yyyy-mm-dd(不是yyyy-dd-mm)
回声08/26/2013 | awk -F /'{printf“%s-%s-%s \ n”,$ 3,$ 1,$ 2}'