Используйте sed или awk для исправления формата даты
Я пытаюсь преобразовать HTML, содержащий таблицу в a .csv-файл с использованием bash
сценарий.
до сих пор я выполнил следующие шаги:
- преобразование в формат Unix (с
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 и изменить формат вручную, но я хотел бы пропустить этого.
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
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}'