Баш - преобразовать все экземпляры формат даты ДД-ММ-гггг гггг-ММ-ДД [закрыт]

да, прежде чем кто-то вскочит и нападет на меня вилами, это повторяющийся вопрос, но другие не работают на меня, поэтому я задаю его себе сейчас.

у меня есть файл CSV, в котором есть даты где-то в каждой записи. Добавленная трудность в конвертации заключается в том, что иногда даты будут иметь одну цифру в течение нескольких дней. Пример записи:

abc,0,2,-2,3-16-1994
xyz,1,2,3,10-09-1994

Я чего-то хочу, желательно СЭД, чтобы преобразовать эти данные, чтобы выглядеть так:

abc,0,2,-2,1994-03-16
xyz,1,2,3,1994-09-10

Я пробовал:

sed 's|(..)-(..)-(....)|--|'

но это дает ошибку, и это на самом деле не покрывает проблемы с одной цифрой.

Я тоже пробовал:

awk -F - '{print }'

это на самом деле имеет желаемый эффект, но опять же не совсем. Команда awk преобразует его, но только месяц и год, и вместо того, чтобы поместить дату туда, где она была, она помещает месяц и год начала строки, оставляя часть дня, где бы она ни была изначально.

любая помощь будет будь крутым!

спасибо заранее.

редактировать

в комментариях справедливо указывалось, что я ошибся со своими примерами. Даты должны быть:

abc,0,2,-2,16-03-1994
xyz,1,2,3,2-05-1994

С желаемым результатом:

abc,0,2,-2,1994-03-16
xyz,1,2,3,1994-05-02

Извините, ребята.

5
задан user1840352
источник

2 ответов

sed -r 's/(\d{1,2})-([0-9]{2})-([0-9]{4})/--/g' кажется, трюк, могут быть и другие "умные" способы ... Я ничего не знаю

мой код:

x="abc,0,2,-2,3-16-1994#xyz,1,2,3,10-09-1994"
echo $x |tr '#' '\n'| sed -r 's/([0-9]{1,2})-([0-9]{2})-([0-9]{4})/--/g'

выдает:

abc,0,2,-2,1994-16-3
xyz,1,2,3,1994-09-10

2 "предупреждения" для ваших данных ... немного непоследовательно (возможно, это было просто ради примера)...

  • в первой строке первый элемент даты не является "дополненным нулями"
  • посмотрев на вторую строку, неясно, являются ли входные данные dd-mm-yyyy или mm-dd-yyyy

позже редактировать: я впервые пропустил часть, что обивка в день было требование, учитывая это, кажется, что следующее помогает

echo $x |tr '#' '\n'| sed -r 's/\b([0-9])-([0-9]{2})-([0-9]{4})\b/--0/g; s/\b([0-9]{2})-([0-9]{2})-([0-9]{4})\b/--/g'

практически у нас есть 2 регулярных выражения один (первый) соответствует "даты", где день имеет только 1 цифру и добавляет отступ " 0 "при выполнении замены, другой соответствует" даты", которые имеют день с 2 цифрами и делает только переупорядочивание элементов

получил идею от здесь https://stackoverflow.com/questions/12129382/add-leading-0-in-sed-substitution, так что спасибо человеку, который ответил, что есть

1
отвечен Lohmar ASHAR 2017-05-23 12:41:47
источник

это работает, когда я проверяю его, обратите внимание, что я поменял день и месяц, так как исходный формат в вашем примере на самом деле mm-dd-yyy. Не уверен, если нулевой обивка важна для вас или нет, не пробовал, что:

sed -i -r 's|([[:digit:]]*)-([[:digit:]]*)-([[:digit:]]*)|--|' test.csv
0
отвечен John C 2017-04-26 23:03:11
источник

Другие вопросы awk bash csv date sed