转换 csv 文件中的日期。加快进程

转换 csv 文件中的日期。加快进程

所以我有一个大的 CSV 文件(70k 行),大约有 60 列。我必须将其中包含纪元时间的列转换为各自的日期。

我有一个有效的脚本。然而,当我在主 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

相关内容