Modifica la data a -7 giorni nel file .csv tramite lo script della shell

Aug 29 2020

Ho un file con record in questo formato:

D20200826,S2927,977,1

Uscita prevista:

D20200819,S2927,977,1

Ora quello che sto cercando di ottenere è se in qualche modo riesco a spostare la data (prima colonna) di 7 giorni nel passato, cioè se la data corrente è 29, voglio che sia 22.

Risposte

1 Kusalananda Aug 29 2020 at 13:40

Supponendo che tu awkabbia funzioni relative al tempo mktime()e strftime()( mawko GNU awk), quindi lo awkscript

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
}

spezzerebbe la specifica della data nella prima colonna delimitata da virgole utilizzando più chiamate substr()e creerebbe un timestamp Unix con mktime().

Diminuirebbe quindi il timestamp generato di esattamente sette giorni (in secondi) e lo formatterebbe come YYYYMMDDstringa di data utilizzando strftime(). La stringa di data generata, insieme al primo carattere dei dati della prima colonna ( Da nell'esempio), viene quindi assegnata alla prima colonna prima che venga stampata l'intera riga modificata.

Testare lo script sopra su alcuni dati:

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

Una variante leggermente più corta:

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

E, come "one-liner":

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
nezabudka Aug 29 2020 at 13:45

Solo per gawk

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