Используйте sed или awk для исправления формата даты

Я пытаюсь преобразовать HTML, содержащий таблицу в a .csv-файл с использованием bash сценарий.

до сих пор я выполнил следующие шаги:

  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.

есть (простой) способ сделать это (с 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 и изменить формат вручную, но я хотел бы пропустить этого.

6 ответов


Awk могу сделать эту задачу довольно легко:

awk '
    BEGIN { FS = OFS = "," } 
    { split(, date, /\//)
       = date[3] "-" date[2] "-" date[1]
      print  
    }
' infile

Это дает:

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

sed -E 's,([0-9]{2})/([0-9]{2})/([0-9]{4}),--,g'

sed "s:,\([0-9]\+\)/\([0-9]\+\)/\([0-9]\+\),:,--,:"

awk будет работать для этого:

echo 08/26/2013 | awk -F/ '{printf "%s-%s-%s\n",,,}'

как бы один из этих 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, где подрешетка не используется для последнего компонента трубопровода, это также должно работать:

echo 08/26/2013 | IFS=/ read m d y; echo "${y}-${m}-${d}"

в последнее время bash, вы также можете использовать shopt -s lastpipe в скрипте, чтобы позволить вышеуказанному вызову работать, но он не будет работать в командной строке (благодаря @mklement0 в комментариях ниже.)

я оставлю это до вас, чтобы выяснить, как интегрировать его с остальными...


до сих пор все ответы очень специфичны для вопроса OP. Вот более общий подход, работающий (GNU, for ) date через awk :

awk 'BEGIN{FS=","}
     {
       "date -d\""  "\" +%Y-%m-%d" | getline mydate; 
       print  ","  "," mydate ","  ","  "," 
     }'

конечно, этот подход будет работать только если формат даты ввода обрабатывается date. AFAICS это не относится к dd/mm/yyyy, к сожалению. Можно попробовать!--13 - >другие команды чем date (не проверял).

Edit: реализовано mklement0 комментировать.

Edit2 : на самом деле это не работает с mawk, который является Debian по умолчанию awk реализация. Очевидное решение-установить gawk когда это возможно.


исправление к awk предположим, что вы ищете гггг-ММ-ДД (не гггг-ДД-ММ)

echo 08/26/2013/ awk-F / '{printf "%s - %s - %S\n",$3,$1,$2}'