Добавьте в CSV столбец меток времени, основанный на других столбцах (используя bash) - PullRequest
0 голосов
/ 28 августа 2018

Мне нужно прочитать файл CSV ( list.csv ) примерно так:

0;John Doe;2001;03;24
1;Jane Doe;1985;12;05
2;Mr. White;2018;06;01
3;Jake White;2017;11;20
...

и добавьте столбец (не имеет значения, где я его поместил) с отметкой времени Unix на основе года / месяца / дня в столбцах 3, 4 и 5, чтобы получить это:

0;John Doe;2001;03;24;985392000
1;Jane Doe;1985;12;05;502588800
2;Mr. White;2018;06;01;1527811200
3;Jake White;2017;11;20;1511136000
...

Итак, я написал это script.sh :

#!/bin/sh

while read line
do
    printf "$line;"
    date -d $(awk -F\; '{print $3$4$5}' <<<$line) +%s
done

и я побежал:

<list.csv ./script.sh

и это работает, но очень медленно, когда дело доходит до очень больших CSV.

Есть ли способ сделать это быстрее в командной строке sed / awk?

Я имею в виду, могу ли я (например) ввести команду bash в строку sed / awk? Например (я знаю, что это не сработает, это всего лишь пример):

awk -F\; '{print $1 ";" $2 ";" $3 ";" $4 ";" $5 ";" $(date -d $3$4$5 +%s)}'

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Для других awks без встроенных функций времени:

awk -F';' '{
    cmd = "date -d "$3 $4 $5" +%s"
    cmd | getline time
    close(cmd)
    $0 = $0 FS time
    print
}' file

или perl

perl -MTime::Piece -F';' -lane '
    print join ";", @F, Time::Piece->strptime("@F[2..4]", "%Y %m %d")->epoch
' file

# or
perl -MTime::Local -F';' -lane '
    print join ";", @F, timelocal(0, 0, 0, $F[4], $F[3]-1, $F[2]-1900)
' file
0 голосов
/ 28 августа 2018

GNU awk на помощь!

$ gawk -F';' '{$0=$0 FS mktime($3" "$4" "$5" 00 00 00")}1' file

0;John Doe;2001;03;24;985410000
1;Jane Doe;1985;12;05;502606800
2;Mr. White;2018;06;01;1527825600
3;Jake White;2017;11;20;1511154000

не уверен, какой час / мин / сек вы используете по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...