
次のようなデータセットがあります:
user1 1234 01/01/2020
user2 2345 02/02/2020
ユーザー名と ID 番号を保持しながら、3 番目の列 (日付) を EPOCH に変換する必要があります。
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
の残りの引数の 1 つを取得することに注意してくださいprintf
。
出力:
user1 1234 1577847600
user2 2345 1580612400
答え2
GNU awk (別名 ) をお持ちの場合は、gawk
その組み込みの timemktime
関数を使用できます (ただし、入力日付形式には最初に何らかの操作が必要です)。
$ 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