シェル スクリプトを使用して、ファイル内の複数のエントリの日付をエポック形式に変換する

シェル スクリプトを使用して、ファイル内の複数のエントリの日付をエポック形式に変換する

以下はファイル内の形式です。日付形式の最初の 2 つの列をエポック形式に変換するのを手伝ってくれる人はいますか?

2018-01-02 05:44:00,2018-01-02 05:59:00,1,702058496,0,0,0,0,0,0,0,0

2018-01-02 05:44:00,2018-01-02 05:59:00,1,702058496,2,0,0,0,0,0,0,0

2018-01-02 05:44:00,2018-01-02 05:59:00,1,702058496,3,332,0,0,0,332,0,0

2018-01-02 05:44:00,2018-01-02 05:59:00,1,702058496,4,0,0,0,0,0,0,0

2018-01-02 05:44:00,2018-01-02 05:59:00,1,702062592,0,0,0,0,0,0,0,0

2018-01-02 05:44:00,2018-01-02 05:59:00,1,702062592,2,0,0,0,0,919,0,0

2018-01-02 05:44:00,2018-01-02 05:59:00,1,702062592,3,919,0,0,0,0,0,0

2018-01-02 05:44:00,2018-01-02 05:59:00,1,702062592,4,0,0,0,0,0,0,0

2018-01-02 05:44:00,2018-01-02 05:59:00,1,702066688,0,0,0,0,0,0,0,0

2018-01-02 05:44:00,2018-01-02 05:59:00,1,702066688,2,0,0,0,0,0,0,0

2018-01-02 05:44:00,2018-01-02 05:59:00,1,702066688,3,0,0,0,0,919,0,0

2018-01-02 05:44:00,2018-01-02 05:59:00,1,702066688,4,0,0,0,0,0,0,0

2018-01-02 10:44:00,2018-01-02 10:59:00,1,702058496,0,0,0,0,0,0,0,0

2018-01-02 10:44:00,2018-01-02 10:59:00,1,702058496,2,0,0,0,0,0,0,0

次のコマンドを試しました。

aa= cat ATMIF.180102-0615 |grep -|awk -F ',' '{print $1}'; for i in cat ATMIF.180102-0615 |grep -|awk -F ',' '{print $1}';do date -d "$aa" "+%s"; 完了

しかし、次のようなエラーが発生します: 日付: 無効な日付2018-01-02 05:44:00\n2018-01-02 05:44:00\n2018-01-02 05:44:00\n2018-01-02 05:44:00\n2018-01-02 05:44:00\n2018-01-02 05:44:00\n2018-01-02 05:44:00\n2018-01-02 05:44:00\n2018-01-02 05:44:00\n2018-01-02 05:44:00\n2018-01-02 05:44:00\n2018-01-02 05:44:00\n2018-01-02 10:44:00\n2018-01-02 10:44:00\n2018-01-02 10:44:00\n2018-01-02 10:44:00\n2018-01-02 10:44:00\n2018-01-02 10:44:00\n2018-01-02 10:44:00\n2018-01-02 10:44:00\n2018-01-02 10:44:00\n2018-01-02 10:44:00\n2018-01-02 10:44:00\n2018-01-02 10:44:00' date: invalid date2018-01-02 05:44:00\n2018-01-02 05:44:00\n2018-01-02 05:44:00\n2018-01-02 05:44:00\n2018-01-02 05:44:00\n2018-01-02 05:44:00\n2018-01-02 05:44:00\n2018-01-02 05:44:00\n2018-01-02 05:44:00\n2018-01-02 05:44:00\n2018-01-02 05:44:00\n2018-01-02 05:44:00\n2018-01-02 10:44:00\n2018-01-02 10:44:00\n2018-01-02 10:44:00\n2018-01-02 10:44:00\n2018-01-02 10:44:00\n2018-01-02 10:44:00\n2018-01-02 10:44:00\n2018-01-02 10:44:00\n2018-01-02 10:44:00\n2018-01-02 10:44:00\n2018-01-02 10:44:00\n2018-01-02 10:44:00' 日付: 無効な日付 `2018-01-02 05:44:00\n2018-01-02 05:44:00\n2018-01-02 05:44:00\n2018-01-02 05:44:00\n2018-01-02 05:44:00\n2018-01-02 05:44:00\n2018-01-02 05:44:00\n2018-01-02 05:44:00\n2018-01-02 05:44:00\n2018-01-02 05:44:00\n2018-01-02 05:44:00\n2018-01-02 05:44:00\n2018-01-02 05:44:00\n2018-01-02 10:44:00\n2018-01-02 10:44:00\n2018-01-02 10:44:00\n2018-01-02 10:44:00\n2018-01-02 10:44:00\n2018-01-02 10:44:00\n2018-01-02 10:44:00\n2018-01-02 10:44:00\n2018-01-02 10:44:00\n2018-01-02 10:44:00\n2018-01-02 10:44:00'

答え1

データが次の場所にあると仮定すると、これが実行されます。

IFS=,;while read line; do 
  ff=($line); 
  ff[0]=`date -d "${ff[0]}" +%s`;
  ff[1]=`date -d "${ff[1]}" +%s`;
  echo "${ff[*]}"; 
done < file.in > file.out

注意: origin 形式に応じて、date コマンドに 'UTC' を追加する必要がある場合があります。

コメントで求められているように、これをインプレースで実行するには、すべてのファイルをループする必要があります。たとえば、find コマンドを使用して、/mypath/to-files/ 内のすべての .csv ファイルを再帰的に一致させます。

for file in $(find /mypath/to-files -name "*.csv"); do
  cp $file /tmp/tmp.csv
  IFS=,;while read line; do 
      ff=($line); 
      ff[0]=`date -d "${ff[0]}" +%s`;
      ff[1]=`date -d "${ff[1]}" +%s`;
      echo "${ff[*]}"; 
    done < /tmp/tmp.csv > $file
done

関連情報