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
。