使用sed或awk修复日期格式

Bar*_*nka 10 regex bash awk sed

我正在尝试使用bash脚本将包含表格的HTML转换为.csv文件.

到目前为止,我已经完成了以下步骤:

  1. 转换为Unix格式(带dos2unix)
  2. 删除所有空格和标签(带sed 's/[ \t]//g')
  3. 删除所有空白行(带sed ':a;N;$!ba;s/\n//g')(这是必要的,因为HTML文件对于表的每个单元格都有一个空行...这不是我的错)
  4. 删除不必要的<td><tr>标签(带sed 's/<t.>//g')
  5. 替换</td>为','(带sed 's/<\/td/,/g')
  6. 替换</tr>为行尾(\n)字符(带sed 's/<\/tr/\n/g')

当然,我把所有这些都放在了管道中.到目前为止,它运作良好.我坚持了最后一步:该表有一个包含日期的列,其中包含格式dd/mm/yyyy,我想将它们转换为yyyy-mm-dd.

是否有(简单)方法(使用sedawk)?

数据样本(在整个sed管道之后):

500,2,13/09/2007,30000.00,12,B-1
501,2,15/09/2007,14000.00,8,B-2
Run Code Online (Sandbox Code Playgroud)

预期结果:

500,2,2007-09-13,30000.00,12,B-1
501,2,2007-09-15,14000.00,8,B-2
Run Code Online (Sandbox Code Playgroud)

我需要这样做的原因是因为我需要将这些数据导入MySQL.我可以在Excel中打开文件并手动更改格式,但我想跳过它.

Bir*_*rei 10

Awk 可以很容易地完成这项任务:

awk '
    BEGIN { FS = OFS = "," } 
    { split($3, date, /\//)
      $3 = date[3] "-" date[2] "-" date[1]
      print $0 
    }
' infile
Run Code Online (Sandbox Code Playgroud)

它产生:

500,2,2007-09-13,30000.00,12,B-1
501,2,2007-09-15,14000.00,8,B-2
Run Code Online (Sandbox Code Playgroud)


ash*_*ash 9

sed -E 's,([0-9]{2})/([0-9]{2})/([0-9]{4}),\3-\2-\1,g'
Run Code Online (Sandbox Code Playgroud)


lur*_*ker 5

sed "s:,\([0-9]\+\)/\([0-9]\+\)/\([0-9]\+\),:,\3-\2-\1,:"
Run Code Online (Sandbox Code Playgroud)


twa*_*erg 5

awk 将为此工作:

echo 08/26/2013 | awk -F/ '{printf "%s-%s-%s\n",$3,$2,$1}'
Run Code Online (Sandbox Code Playgroud)

这些bash-only 选项之一也是如此:

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}"
Run Code Online (Sandbox Code Playgroud)

如果您碰巧使用ksh,其中子外壳不用于管道的最后一个组件,这也应该起作用:

echo 08/26/2013 | IFS=/ read m d y; echo "${y}-${m}-${d}"
Run Code Online (Sandbox Code Playgroud)

最近bash,您还可以使用shopt -s lastpipe在脚本中以允许上述调用也能工作,但它不能在命令行上工作(感谢@mklement0 在下面的评论中)。

我会把它留给你来弄清楚如何将它与其他部分集成......