日付をcsvファイルに変換します。プロセスを高速化

日付をcsvファイルに変換します。プロセスを高速化

そのため、約60個の列を含む大きなCSVファイル(70,000行)があります。新しい起源時間を含む列をその日付に変換する必要があります。

動作するスクリプトがあります。ところで、メインCSVファイルに使用すると時間がかかります。実際にはまったく実行されませんが、毎秒約5行を処理しています。

i=1
for line in $(cat data.csv | cut -d, -f11);
do
    if [[ $line =~ ^[0-9]{2,}$ ]];
    then
        day=$(date -r ${line} | cut -d' ' -f1 )
        sed_comm="$i""s/$line/$day/"
        sed -E -i.bak $sed_comm data.csv
    fi
    i=$(($i+1))
done

これはファイルの小さなバージョンではうまく機能しますが、デフォルトのバージョンでは時間がかかります。だから私の質問は次のとおりです。何時間もかかる方法はありますか?

スピードを上げる方法を探してみましたが、これまで何も出ていませんでした。

私は実際にsedがどのように機能するかを知っているので、今これをやっています。しかし、スピードを上げるための確実な方法を知っている人がいるなら、ありがとう。

小さなファイルバージョン:https://ufile.io/3qtcv0hz

注:macOSでzshを使用して実行

ベストアンサー1

GNU awkを使う(gawkファイルがフィールドに引用符で囲まれたカンマを持たない「簡単な」CSVであるとします。

gawk -F, 'BEGIN{OFS=FS} {$11 = strftime("%c",$11)} 1' file.csv

列 11 を、エポック秒からその地域で好みの日付と時刻の形式 ( %c) に変換します。

Millerに似ています(挿入されたコンマを含むより複雑なCSVを処理できます)。

mlr --csv --implicit-csv-header put '$11 = strftime($11,"%c")' file.csv

利用可能な他の日付/時刻形式についてはを参照してくださいman strftime

おすすめ記事