SHELL обновляет столбец даты в файле до метки времени - PullRequest
0 голосов
/ 12 июня 2018

При вводе:

1,aaaa,2018-11-03
2,bbbb,2018-02-03

Ожидаемый вывод

Скрипт должен обрабатывать дату как формат MST7MDT и преобразовывать ее в UTC:

1,aaaa,2018-11-03 06:00:00
2,bbbb,2018-02-03 07:00:00

Ответы [ 2 ]

0 голосов
/ 15 июня 2018

Работает нормально с кодом ниже

#!/bin/bash 
file=myfile 
while IFS= read -r line 
do 
csid=$(echo $line | cut -f1 -d,) 
name=$(echo $line | cut -f2 -d,) 
oldmt=$(echo $line | cut -f3 -d,) 
echo "$csid"",""$name"","$(date -u -d "TZ=\"MST7MDT\" $oldmt" "+%Y-%m-%d %H:%M:%S") >> newmyfile.dat    done < $file
0 голосов
/ 12 июня 2018

Вы не указываете свою ОС.Предполагая, что у вас есть дата GNU:

(
    IFS=,
    while read -ra fields; do 
        t=$(TZ=America/Denver date -d "${fields[-1]}" "+%s")
        fields[-1]=$(TZ=UTC date -d "@$t" "+%F %T")
        echo "${fields[*]}"
    done
) <<END
1,aaaa,2018-11-03
2,bbbb,2018-02-03
END
1,aaaa,2018-11-03 06:00:00
2,bbbb,2018-02-03 07:00:00

Мне нравится экосистема библиотеки Perl's DateTime:

perl -E '
    use DateTime::Format::Strptime;
    my $dateparser = DateTime::Format::Strptime->new(
        pattern   => "%Y-%m-%d",
        time_zone => "America/Denver"
    );
    while (<>) {
        chomp;
        my @fields = split /,/;
        my $datetime = $dateparser->parse_datetime( $fields[-1] );
        $fields[-1] = $datetime->set_time_zone("UTC")->strftime("%Y-%m-%d %T");
        say join ",", @fields;
    }
' <<END
1,aaaa,2018-11-03
2,bbbb,2018-02-03
END
...