Изменить дату на -7 дней в файле.csv с помощью сценария оболочки

Вы смотрели логи? Надеюсь, вы сможете найти их с помощью sudo locate catalina. Вы также можете попробовать развернуть пример приложения в каталоге веб-приложений.

1
29.08.2020, 09:27
2 ответа

Предполагая, что у вашего awkесть время -связанные функции mktime()иstrftime()(mawkили GNU awk), тогда скрипт awk

BEGIN {
        OFS = FS = ","
}

{
        t = mktime(sprintf("%4d %.2d %.2d 00 00 00",
                substr($1,2,4),
                substr($1,6,2),
                substr($1,8,2)));

        $1 = substr($1,1,1) strftime("%Y%m%d", t - 7*24*60*60)

        print
}

разделит спецификацию даты в первом столбце с разделителями-запятыми -с помощью нескольких вызовов substr()и создаст отметку времени Unix с mktime().

Затем он уменьшит сгенерированную метку времени ровно на семь дней (в секундах )и повторно -отформатирует ее как YYYYMMDDстроку даты, используя strftime(). Сгенерированная строка даты вместе с первым символом данных первого столбца (a Dв примере )затем назначается первому столбцу до того, как вся измененная строка будет напечатана.

Тестирование вышеуказанного скрипта на некоторых данных:

$ cat file
D20200826,S2927,977,1
D20200106,S2927,977,1
$ awk -f script.awk file
D20200819,S2927,977,1
D20191230,S2927,977,1

Несколько укороченный вариант:

BEGIN { OFS = FS = "," }

{
        $1 = substr($1,1,1) strftime("%Y%m%d",
                mktime(sprintf("%4d %.2d %.2d 00 00 00",
                        substr($1,2,4),
                        substr($1,6,2),
                        substr($1,8,2))) - 7*24*60*60)
}

1

И, как "один -лайнер":

awk -F, '{ $1 = substr($1,1,1) strftime("%Y%m%d",mktime(sprintf("%4d %.2d %.2d 00 00 00",substr($1,2,4),substr($1,6,2),substr($1,8,2)))-7*24*60*60) }; 1' OFS="," file
1
18.03.2021, 23:09

Только для зевак

awk -F, '{$1 = strftime("D%Y%m%d",\
mktime(gensub(/.(.{4})(.{2})(.{2})/, "\\1 \\2 \\3 0 0 0", 1, $1))-7*3600*24)}1' OFS=, file
0
18.03.2021, 23:09

Теги

Похожие вопросы