列出力で日付をEPOCHに置き換える

列出力で日付をEPOCHに置き換える

次のようなデータセットがあります:

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

関連情報