使用sed或awk修复日期格式

时间:2013-08-26 21:10:00

标签: regex bash sed awk

我正在尝试使用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'
  7. 当然,我把所有这些都放在了管道中。到目前为止,它运作良好。最后一步我坚持:表格中有一个日期列,其格式为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
    

    预期结果

    500,2,2007-09-13,30000.00,12,B-1
    501,2,2007-09-15,14000.00,8,B-2
    

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

6 个答案:

答案 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选项)dateawk

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}'