
我有一組這樣的數據:
user1 1234 01/01/2020
user2 2345 02/02/2020
我需要將第三列(日期)轉換為 EPOCH,同時保留使用者名稱和 ID 號碼。
user1 1234 1577862000
user2 2345 1580626800
我已經能夠進行轉換和列印,但是新日期被附加到新行中。
$awk '{print($1,$2)}; system("date -d "$3" +%s")' data
user1 1234
1577862000
user2 2345
1580626800
如何使新的 EPOCH 日期與第 1 列和第 2 列在同一行?
答案1
print
預設附加換行符。使用printf
:
awk '{printf "%s %s ",$1,$2; system("date -d "$3" +%s")}' data
OFS
如果定義了特殊的輸出欄位分隔符,您可以使用
awk '{printf "%s%s%s%s",$1,OFS,$2,OFS; system("date -d "$3" +%s")}' data
請注意,每個都%s
獲取 的剩餘參數之一printf
。
輸出:
user1 1234 1577847600
user2 2345 1580612400
答案2
如果你有 GNU awk (又名gawk
),你可以使用它的內建時間mktime
函數(儘管輸入日期格式首先需要一些操作):
$ 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
或者,Miller 提供 C 型strptime
和strftime
:
$ mlr --nidx put '$3 = strftime(strptime($3,"%d/%m/%Y"),"%s")' data
user1 1234 1577854800
user2 2345 1580619600
或在 Perl 中類似地使用 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