macOSでawk / gawkを使用して日付形式を変換する

macOSでawk / gawkを使用して日付形式を変換する

何百万行ものデータがあり、上司にデータの再フォーマットを要求しました。

形式は次のとおりです。

06/28/2022,04:00,142.01,142.38,141.59,142.15,3151
06/28/2022,04:01,142.1,142.1,142.1,142.1,196

最初の日付フィールドの形式を次のように変更する必要があります。

20220628,04:00,142.01,142.38,141.59,142.15,3151
20220628,04:01,142.1,142.1,142.1,142.1,196

%Y%m%d

私は以下を持っています:

gawk -F"," '{OFS=","; $1=strftime("%Y%m%d", $1); print $0}' AAPL.txt > AAPL.csv

ところが奇妙な点は、働くのに生成された日付が1969年ということです。

19691231,04:00,142.01,142.38,141.59,142.15,3151
19691231,04:01,142.1,142.1,142.1,142.1,196

理由がわからない。 MacOSでは利用できず、外部呼び出しによってパフォーマンスが大幅に低下する可能性があるgawkため、これを選択しました。awkstrftimedate

答え1

awk strftime()GNUはUnixタイムスタンプを2番目の引数として期待するため、コードが期待どおりに機能しません。任意の日付/時刻文字列を解析できません。

しかし、strftime()ここでは実際にこれは必要ありません。

$ awk -F , 'BEGIN { OFS=FS } { split($1,a,"/"); $1 = a[3] a[1] a[2] }; 1' file
20220628,04:00,142.01,142.38,141.59,142.15,3151
20220628,04:01,142.1,142.1,142.1,142.1,196

これは入力の各行を単純なカンマ区切りフィールドとして扱い、最初のフィールドを配列/に分割しますa。次いで、第1のフィールドは、所望の順序で連結された配列要素に形状が変更される。

1コードの終わりにあるアイルランドは、awk変更されたレコードが出力されるようにします。

これはawkmacOSのデフォルト設定として機能します。入力日付を文字列として処理し、単純に再編成するので、特別な日付書式設定機能は必要ありません。日付の唯一の仮定は、DD/MM/YYYY入力でも常に形式であり、YYYYMMDD出力でも形式でなければならないことです。

答え2

strftimeフィールドを交換するだけで、日付処理などの機能は必要ありません。sedここではうまくいきます。

sed 's@\([^/]*\)/\([^/]*\)/\([^,]*\)@\3\1\2@' sample

関連情報