何百万行ものデータがあり、上司にデータの再フォーマットを要求しました。
形式は次のとおりです。
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
ため、これを選択しました。awk
strftime
date
答え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
変更されたレコードが出力されるようにします。
これはawk
macOSのデフォルト設定として機能します。入力日付を文字列として処理し、単純に再編成するので、特別な日付書式設定機能は必要ありません。日付の唯一の仮定は、DD/MM/YYYY
入力でも常に形式であり、YYYYMMDD
出力でも形式でなければならないことです。
答え2
strftime
フィールドを交換するだけで、日付処理などの機能は必要ありません。sed
ここではうまくいきます。
sed 's@\([^/]*\)/\([^/]*\)/\([^,]*\)@\3\1\2@' sample