エポック時間を取り、新しい列として追加

エポック時間を取り、新しい列として追加

UTCタイムスタンプを含むタブで区切られた次の入力ファイルがあります。新しい起源時間を計算し、新しい列として追加するには?このファイルは、60MM以上のラインを含む大容量ファイルです。

a   b
0   2020-03-03 15:46:52
1   2020-03-02 11:05:17

出力:

a   b                   c  
0   2020-03-03 15:46:52 1583279212
1   2020-03-02 11:05:17 1583175917

答え1

GNUを使用awkしてMK時間:

awk '
  BEGIN{ FS=OFS="\t" }
  FNR==1{ print $0, "c"; next }
  {
    split($2, a, /[ :-]/)
    print $0, mktime(a[1]" "a[2]" "a[3]" "a[4]" "a[5]" "a[6], 1)
  }
' file
  • タブ文字を入力および出力フィールド区切り文字として使用
  • cタイトル行に追加
  • a:スペース文字を区切り文字として2番目のフィールドを配列に分割し、-UTCフラグを使用してタイムスタンプを印刷します。

出力:

a       b       c
0       2020-03-03 15:46:52     1583250412
1       2020-03-02 11:05:17     1583147117

答え2

大容量ファイルにどれほど適しているかはわかりませんが、これを試してください。ミラー

$ TZ=UTC mlr --pprint --fs tab put -S '$c = strftime(strptime($b,"%Y-%m-%d %H:%M:%S"),"%s")' file
a   b                                   c
0   2020-03-03 15:46:52 1583250412
1   2020-03-02 11:05:17 1583147117

(OFSがタブの場合、タイトルの並べ替えが混乱しているようです...)。

答え3

プロセス置換をサポートする他のシェルdateでGNUを使用する:bash

$ paste file <( echo c; date -u -f <( cut -f 2 file | sed 1d ) +%s )
a       b       c
0       2020-03-03 15:46:52     1583250412
1       2020-03-02 11:05:17     1583147117

最も内側のプロセスは、<( cut -f 2 file | sed 1d )元のデータを生成した2番目の列(タイムスタンプ)を置き換え、ヘッダーを削除します。これらのタイムスタンプはdateプロセス置換オプションを介してGNUに入力され、出力フォーマット-f文字列を使用してUnix秒に変換されます%s。 GNUには、現地時間ではなくUTC時刻を印刷する-uオプションがあります。date

外部プロセスは<( echo c; date ... )新しい出力列のヘッダーを置き換え、その列のデータを生成します。

次に、貼り付けを既存のデータの新しい列として使用しますpaste

関連情報