区切り文字インデックスを取得し、EPOCH時間を変換します。

区切り文字インデックスを取得し、EPOCH時間を変換します。

最初の行から時刻を取得し、位置インデックスを取得してから、他の行のEPOCH時刻を人間が読める時刻に変換する必要があります。 EPOCH時間位置はランダムですが、ヘッダーがあります。例は次のとおりです。

Name,city,time
ABC,New York,1667271686096
CDF,Palo Alto,1667271685202

答え1

入力がCSVであると仮定する場合は、次のようにします。ミラーmlr)フィールドの値をtime(フィールドに表示される順序に関係なく)Unix時間から現在のロケールの現地時間表現に変換します。

$ mlr --csv put '$time = strftime_local($time,"%+")' file
Name,city,time
ABC,New York,Sat Sep 27 01:54:56 CEST 54803
CDF,Palo Alto,Sat Sep 27 01:40:02 CEST 54803
$ TZ=Canada/Central mlr --csv put '$time = strftime_local($time,"%+")' file
Name,city,time
ABC,New York,Fri Sep 26 18:54:56 CDT 54803
CDF,Palo Alto,Fri Sep 26 18:40:02 CDT 54803

UTC時間の場合は、strftime()次のものを代わりに使用してくださいstrftime_local()

$ mlr --csv put '$time = strftime($time,"%+")' file
Name,city,time
ABC,New York,Fri Sep 26 23:54:56 UTC 54803
CDF,Palo Alto,Fri Sep 26 23:40:02 UTC 54803

他の時間形式の場合、または関数により具体的な時間形式文字列を提供しますstrftime()(システムマニュアルを参照strftime_local())。strftime

$ mlr --csv put '$time = strftime_local($time,"At the hour %H of day %j of the year %Y")' file
Name,city,time
ABC,New York,At the hour 01 of day 270 of the year 54803
CDF,Palo Alto,At the hour 01 of day 270 of the year 54803

sec2gmt()Millerのバージョンとシステムに応じて、常により具体的な時間形式文字列を使用したり、使いやすくした機能に切り替えることができますsec2localtime()

$ mlr --csv put '$time = sec2gmt($time)' file
Name,city,time
ABC,New York,54803-09-26T23:54:56Z
CDF,Palo Alto,54803-09-26T23:40:02Z
$ TZ=Europe/Stockholm mlr --csv put '$time = sec2localtime($time)' file
Name,city,time
ABC,New York,54803-09-27 01:54:56
CDF,Palo Alto,54803-09-27 01:40:02
$ TZ=Canada/Central mlr --csv put '$time = sec2localtime($time)' file
Name,city,time
ABC,New York,54803-09-26 18:54:56
CDF,Palo Alto,54803-09-26 18:40:02

答え2

Perlの場合は、次のようにします。リスト::追加ユーティリティfirst_index「time」を含む最初のフィールドのインデックス番号を検索する汎用モジュール日付形式機能の場合time2str()

$ perl -MList::MoreUtils=first_index -MDate::Format -F, -lne '
  if ($.==1) {
    $tfield = first_index { m/time/i }, @F ;
  } else {
    $F[$tfield] = time2str("%Y-%m-%d %H:%M:%S",$F[$tfield])
  };
  print join(",",@F)' file.csv
Name,city,time
ABC,New York,54803-09-27 09:54:56
CDF,Palo Alto,54803-09-27 09:40:02

注:PerlのDate::Formatモジュールは、以下のタイムスタンプには問題ありません。2038年1月19日 03:14:07、通常Perlはそうではありません。なぜならパールv5.12(2010年4月出版)。他の言語は、言語および/またはオペレーティングシステムがまだ時間値に32ビット符号付き整数を使用しているかどうかに応じて正しく機能する場合と動作しない場合があります(Linuxは、すべてのアーキテクチャ、32ビットでも64ビットtime_tに切り替えます。 )。もの、v5.1バージョン)。 2020年には6つ)。

また、使用されている両方のモジュールはPerlの標準として含まれていません。あなたはそれらをインストールする必要がありますファンまたは配布用にパッケージ化されている場合は、ディストリビューションのパッケージマネージャ(Debianやデリバティブなどsudo apt-get install libtimedate-perl liblist-moreutils-perl)を介して

関連情報