
次のデータを含むファイルがあり、最初のフィールド値を日付に変換しようとしましたが、2番目のフィールドがありません。
cat memoey-total.csv
1700561388,277126765312
1700561647,277126765312
1700561811,277126765312
1700562945,277126765312
1700563689,277126765312
awk '{$1 = strftime("%Y%m%d%H%M%S", substr($1,1,10))} 1' memoey-total.csv
20231121100948
20231121101407
20231121101651
20231121103545
20231121104809
20231121110003
20231121111003
20231121112003
必要な形式に変換できますが、出力から2番目のフィールドを取得するにはどうすればよいですか?
答え1
strftime
入力と出力のフィールド区切り文字としてカンマを使用するようにAWK(技術的にはGawk、使用中のため)に指示する必要があります。
$ awk 'BEGIN { OFS = FS = "," } {$1 = strftime("%Y%m%d%H%M%S", substr($1,1,10))} 1' memoey-total.csv
20231121110948,277126765312
20231121111407,277126765312
20231121111651,277126765312
20231121113545,277126765312
20231121114809,277126765312
そしてゴーク5.3.0以上、あなたはそれを使用することができますCSVモード(--csv
)の代わりに(最新バージョンでも利用可能)本当のことはありません。、しかし後者ではないstrftime
)。
答え2
そしてperl
:
perl -MPOSIX -pe 's/\d+/strftime("%Y%m%d%H%M%S", localtime($&))/e'
最初の数値シーケンスを対応する現地時間(YYYYmmddHHMMSS形式)に変換します。
現地時間の代わりにUTC時間が必要な場合は、コマンドを置き換えるか、そのコマンドのプレフィックスを付けますlocaltime
。gmtime
TZ=UTC0
¹この形式はタイムゾーンオフセットを指定しないため、DSTが実行されるタイムゾーンではあいまいです。これは、2つの異なるエポック時間が同じタイムスタンプを提供できるためです。たとえば、両方とも1698539456
ヨーロッパ/ロンドンのタイムゾーンで1698543056
同じタイムスタンプを作成します。20231029013056