С GNU sed
sed -E '2,$ s/(("[^"]*",){4})("[^"]+")(.*)/echo \x27\1"\x27$(date -d \3 +%s)\x27"\4\x27/e'
2,$
, чтобы пропустить обработку заголовка (("[^"]*",){4})
первые четыре столбца ("[^"]+")
пятый столбец (.*)
остальная часть строки echo \x27\1"\x27
и \x27"\4\x27
сохраняют первые четыре столбца и оставшуюся часть строки после пятого столбца вместе с добавлением двойных кавычек к результату преобразования даты $(date -d \3 +%s)
вызов команды оболочки со значением пятого столбца
Обратите внимание, что эта команда завершится ошибкой, если ввод может содержать одинарные кавычки. Это можно обойти, используя s/\x27/\x27\\&\x27/g
.
Вы можете увидеть команду, которая выполняется с помощью опции -n
, а pe
flags
sed -nE '2,$ s/(("[^"]*",){4})("[^"]+")(.*)/echo \x27\1"\x27$(date -d \3 +%s)\x27"\4\x27/pe'
даст
echo '"58.75","5.33","kg","7","'$(date -d "2020-7-11 19:29:29" +%s)'","5"'
Для формата 58.25,5.89, kg, 7,2020 / 7/12 11:23:46, "5"
попробуйте
sed -E '2,$ s/(([^,]*,){4})([^,]+)(.*)/echo \x27\1\x27$(date -d "\3" +%s)\x27\4\x27/e'
или (адаптировано из { ссылка })
awk 'BEGIN{FS=OFS=","} NR>1{$5=mktime(gensub(/[:\/]/, " ", "g", $5))} 1'
Примечание: Для решения sed
, если ввод может поступать из внешнего источника, вам придется позаботиться о том, чтобы избежать злонамеренного намерения, как указано в комментариях. Один из способов - сопоставить пятый столбец с помощью [0-9: -]+
или аналогичного.