Ersetzen des Datums durch EPOCH in der Spaltenausgabe

Ersetzen des Datums durch EPOCH in der Spaltenausgabe

Ich habe einen Datensatz wie diesen:

user1 1234 01/01/2020
user2 2345 02/02/2020

Ich muss die dritte Spalte (Datum) in EPOCH konvertieren und dabei den Benutzernamen und die ID-Nummer beibehalten.

user1 1234 1577862000
user2 2345 1580626800

Die Konvertierung und der Ausdruck haben bei mir geklappt, das neue Datum wird allerdings an eine neue Zeile angehängt.

$awk '{print($1,$2)}; system("date -d "$3" +%s")' data
user1 1234
1577862000
user2 2345
1580626800

Wie kann ich das neue EPOCH-Datum in derselben Zeile wie die Spalten 1 und 2 platzieren?

Antwort1

printfügt standardmäßig eine neue Zeile an. Verwenden Sie printf:

awk '{printf "%s %s ",$1,$2; system("date -d "$3" +%s")}' data

Wenn ein spezielles Ausgabefeldtrennzeichen OFSdefiniert wurde, könnten Sie verwenden

awk '{printf "%s%s%s%s",$1,OFS,$2,OFS; system("date -d "$3" +%s")}' data

Beachten Sie, dass jeder %seines der verbleibenden Argumente erhält printf.

Ausgabe:

user1 1234 1577847600
user2 2345 1580612400

Antwort2

Wenn Sie über GNU awk (auch bekannt als gawk) verfügen, können Sie die darin integrierte Zeitfunktion verwenden mktime(das Eingabedatumsformat muss allerdings zunächst etwas bearbeitet werden):

$ gawk 'split($3,a,"/") {$3 = mktime(sprintf("%04d %02d %02d 00 00 00",a[3],a[2],a[1]))} 1' data
user1 1234 1577854800
user2 2345 1580619600

Alternativ bietet Miller einen C-Stil strptimeund strftime:

$ mlr --nidx put '$3 = strftime(strptime($3,"%d/%m/%Y"),"%s")' data
user1 1234 1577854800
user2 2345 1580619600

oder ähnlich in Perl, mit dem Modul Time::Piece:

$ perl -MTime::Piece -alne '
    $t = pop @F; print join " ", @F, Time::Piece->strptime($t,"%d/%m/%Y")->strftime("%s")
  ' data
user1 1234 1577854800
user2 2345 1580619600

verwandte Informationen