Как преобразовать дату в файле csv в определенном столбце c в дату unix - PullRequest
1 голос
/ 12 июля 2020

У меня есть файл csv с этими столбцами:

"Weight","Impedance","Units","User","Timestamp","PhysiqueRating"
"58.75","5.33","kg","7","2020-7-11 19:29:29","5"

Конечно, я могу преобразовать команду даты: date -d '2020-7-11 19:29:29' +%s

Результаты: 1594488569

Как заменить эту дату в csv файле в скрипте bash?

Ответы [ 3 ]

3 голосов
/ 12 июля 2020

С 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: -]+ или аналогичного.

2 голосов
/ 12 июля 2020

С GNU awk для gensub () и mktime ():

$ awk 'BEGIN{FS=OFS="\""} NR>1{$10=mktime(gensub(/[-:]/," ","g",$10))} 1' file
"Weight","Impedance","Units","User","Timestamp","PhysiqueRating"
"58.75","5.33","kg","7","1594513769","5"
2 голосов
/ 12 июля 2020

Использование GNU awk:

$ gawk '
BEGIN {
    FS=OFS=","
}
{
    n=split($5,a,/[-" :]/)
    if(n==8)
        $5="\"" mktime(sprintf("%s %s %s %s %s %s",a[2],a[3],a[4],a[5],a[6],a[7])) "\""
}1' file

Вывод:

"Weight","Impedance","Units","User","Timestamp","PhysiqueRating"
"58.75","5.33","kg","7","1594484969","5"
...