
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
print
fü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 OFS
definiert 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 %s
eines 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 strptime
und 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